许多R教科书鼓励使用$从data.frames ^中检索变量(列)。但是,我发现这在函数内部不起作用,我无法弄清楚原因。
data(BOD)
print(BOD)
# These work.
BOD$'demand'
BOD[ ,'demand']
# This works.
myFunc1 <- function(x, y){
z <- x[ , y]
return(z)
}
out <- myFunc(BOD, 'demand')
# This doesn't work.
myFunc2 <- function(x, y){
z <- x$y
return(z)
}
out <- myFunc2(BOD, 'demand')
我注意到在R语言定义中它说:
使用$的表单适用于列表和pairlists等递归对象。它只允许使用文字&gt;字符串或符号作为索引。也就是说,索引是不可计算的:对于&gt;需要评估表达式以查找索引的情况,请使用x [[expr]]。当$应用于&gt;非递归对象时,结果总是为NULL:从R 2.6.0开始,这是一个错误。
myFunc2上面是一个例子,其中$没有提供文字字符串吗?
^ Zuur 2009'第61页初学者指南
^ Spector 2008'数据操作与R'p 26,64,69
答案 0 :(得分:5)
您也可以使用[[而不是$
myFunc2 <- function(x, y){
+ z <- x[[y]]
+ return(z)
+ }
> myFunc2(BOD, 'demand')
[1] 8.3 10.3 19.0 16.0 15.6 19.8
答案 1 :(得分:3)
就我个人而言,我认为美元运算符$
在R控制台上非常方便实用。它允许完成和部分namings功能。 $
对于交互模式非常有用。但是如果你想在你的函数中使用它,你应该使用do.call
创建一个调用,如下所示:
myFunc2 <- function(x, y){
z <- do.call('$',list(x,y))
return(z)
}
myFunc2(BOD,'demand')
[1] 8.3 10.3 19.0 16.0 15.6 19.8
但正如您所提到的,使用[
更简单:
myFunc2 <- function(x, y){
z <- x[,y]
return(z)
}
答案 2 :(得分:1)
如果您想完全模仿$
运算符,可以使用[[
并将参数exact
设置为FALSE
以允许部分匹配。
BOD <- data.frame(demand = 1:10)
myFunc2 <- function(x, y) x[[y, exact = FALSE]]
BOD$dem
## [1] 1 2 3 4 5 6 7 8 9 10
BOD[["dem"]]
## NULL
myFunc2(BOD, "dem")
## [1] 1 2 3 4 5 6 7 8 9 10