From henrik@p@rn @ending from ntnu@no  Wed Nov 28 13:57:37 2018
From: henrik@p@rn @ending from ntnu@no (=?iso-8859-1?Q?Henrik_P=E4rn?=)
Date: Wed, 28 Nov 2018 12:57:37 +0000
Subject: [Rd] named arguments discouraged in `[.data.frame` and
 `[<-.data.frame`
Message-ID: <fa0ff7bd9b544890be2ba300d5045473@it-ex11.win.ntnu.no>

tl;dr:

Why are named arguments discouraged in `[.data.frame`, `[<-.data.frame` and `[[.data.frame`?

(because this question is of the kind 'why is R designed like this?', I though R-devel would be more appropriate than R-help)

#############################

Background:

Now and then students presents there fancy functions like this: 

myfancyfun(d,12,0.3,0.2,500,1000,FALSE,TRUE,FALSE,TRUE,FALSE)

Incomprehensible. Thus, I encourage them to use spaces and name arguments, _at least_ when trying to communicate their code with others. Something like:

myfancyfun(data = d, n = 12, gamma = 0.3, prob = 0.2,
                      size = 500, niter = 1000, model = FALSE,
                     scale = TRUE, drop = FALSE, plot = TRUE, save = FALSE)
 

Then some overzealous students started to use named arguments everywhere. E-v-e-r-y-w-h-e-r-e. Even in the most basic situation when indexing vectors (as a subtle protest?), like:

vec <- 1:9

vec[i = 4]
`[`(x = vec, i = 4)

vec[[i = 4]]
`[[`(x = vec, i = 4)

vec[i = 4] <- 10
`[<-`(x = vec, i = 4, value = 10)

...or when indexing matrices:

m <- matrix(vec, ncol = 3)
m[i = 2, j = 2]
`[`(x = m, i = 2, j = 2)
# 5

m[i = 2, j = 2] <- 0
`[<-`(x = m, i = 2, j = 2, value = 0)

######

This practice indeed feels like overkill, but it didn't seem to hurt either. Until they used it on data frames. Then suddenly warnings appeared that named arguments are discouraged:

d <- data.frame(m)

d[[i = "X2"]]
# [1] 4 5 6
# Warning message:
# In `[[.data.frame`(d, i = "X2") :
#  named arguments other than 'exact' are discouraged

d[i = 2, j = 2]
# [1] 0
# Warning message:
# In `[.data.frame`(d, i = 2, j = 2) :
#  named arguments other than 'drop' are discouraged

d[i = 2, j = 2] <- 5
# Warning message:
# In `[<-.data.frame`(`*tmp*`, i = 2, j = 2, value = 5) :
#  named arguments are discouraged


##################################

Of course I could tell them "don't do it, it's overkill and not common practice" or "it's just a warning, don't worry". However, I assume the warnings are there for a good reason.

So how do I explain to the students that named arguments are actively discouraged in `[.data.frame` and `[<-.data.frame`, but not in `[` and `[<-`? When will they get bitten?



[Rd] named arguments discouraged in `[.data.frame` and `[<-.data.frame`
=?iso-8859-1?Q?Henrik_P=E4rn?=