Таким образом, кажется, что эта проблема больше связана с $
и тем, как обычно ожидают, что имена без кавычек будут вторыми параметрами, а не строками. Посмотрите на этот пример
dflist <- list(
data.frame(a=1:3, z=31:33),
data.frame(b=10:12, a=4:6, z=31:33)
)
lapply(dflist,
function(x, z) {
print(paste("z:",z));
`$`(x,z)
},
z="a"
)
Мы видим результаты
[1] "z: a"
[1] "z: a"
[[1]]
[1] 31 32 33
[[2]]
[1] 31 32 33
, поэтому значение z
устанавливается на «a», но $
не оценивает второй параметр. Поэтому он возвращает столбец «z», а не столбец «a». Это приводит к этому интересному набору результатов
a<-"z"; `$`(dflist[[1]], a)
# [1] 1 2 3
a<-"z"; `$`(dflist[[1]], "z")
# [1] 31 32 33
a<-"z"; `$.data.frame`(dflist[[1]], a)
# [1] 31 32 33
a<-"z"; `$.data.frame`(dflist[[1]], "z")
# [1] 31 32 33
. Когда мы называем $.data.frame
непосредственно, мы обходим стандартную депарацию, которая встречается в примитиве до отправки (что происходит вблизи здесь в источнике).
Добавленный catch с lapply
заключается в том, что он передает аргументы функции через механизм ...
. Например,
lapply(dflist, function(x, z) sys.call())
# [[1]]
# FUN(X[[2L]], ...)
# [[2]]
# FUN(X[[2L]], ...)
Это означает, что при вызове $
он отбрасывает ...
в строку "..."
. Это объясняет это поведение
dflist<- list(data.frame(a=1:3, "..."=11:13, check.names=F))
lapply(dflist, `$`, "a")
# [[1]]
# [1] 11 12 13
То же самое происходит, когда вы пытаетесь использовать ...
самостоятельно
f<-function(x,...) `$`(x, ...);
f(dflist[[1]], "a");
# [1] 11 12 13
`$`(dflist[[1]], "a")
# [1] 1 2 3