使用函数内的$索引数据框?

时间:2013-07-18 00:09:10

标签: r function indexing

许多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

3 个答案:

答案 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