假设我有一个数据框列表
dflist <- list(data.frame(a=1:3), data.frame(b=10:12, a=4:6))
如果我想从列表中的每个项目中提取第一列,我可以这样做:
lapply(dflist, `[[`, 1)
# [[1]]
# [1] 1 2 3
#
# [[2]]
# [1] 10 11 12
为什么我不能以同样的方式使用"$"函数?
lapply(dflist, `$`, "a")
# [[1]]
# NULL
#
# [[2]]
# NULL
但是这两种方式都可以使用:
lapply(dflist, function(x) x$a)
`$`(dflist[[1]], "a")
我明白在这种情况下可以使用。
lapply(dflist, `[[`, "a")
但是我正在使用一个S4对象,似乎不允许使用[[
进行索引。例如:
library(adegenet)
data(nancycats)
catpop <- genind2genpop(nancycats)
mylist <- list(catpop, catpop)
#works
catpop[[1]]$tab
#doesn't work
lapply(mylist, "$", "tab")
# Error in slot(x, name) :
# no slot of name "..." for this object of class "genpop"
#doesn't work
lapply(mylist, "[[", "tab")
# Error in FUN(X[[1L]], ...) : this S4 class is not subsettable
lapply(dflist, function(x) "$"(x, "a"))
。 - Timmethods("$", dflist[[1]])
找到答案的某些线索。 - Frank$.data.frame
的存在,只是我很惊讶问题是由方法分派引起的。我想不出还有多少其他情况需要显式调用通用函数的某种形式。 - MrFlicklapply()
的奇怪的惰性求值特性有关,但由于其中一些(或者说全部)操作是在C代码层面进行的,我从未完全理解它在底层做了什么。 - Josh O'Brien$
解析参数有关,而不是特别与 lapply 有关。请参见此示例:f<-function(x,...) \
$`(x, ...); f(dflist[[1]], "a"); `$`(dflist[[1]], "a")。这是因为
$不是一个“典型”的通用函数,它是一个
.Primitive()`,所以我敢打赌秘密就在这里。 - MrFlick$
不太适合在谷歌上搜索。 - mt1022