在函数内使用`with`的困难

时间:2014-05-03 14:56:16

标签: r function

我试图了解如何将数据帧传递给R函数。我在StackOverflow上找到了这个问题的答案,它提供了以下演示/ solution

Pass a data.frame column name to a function

df <- data.frame(A=1:10, B=2:11, C=3:12)
fun1 <- function(x, column){
  max(x[,column])
}

fun1(df, "B")
fun1(df, c("B","A"))

这对我有意义,但我不会理解在函数中调用数据帧的规则。请看以下示例:

data(iris)
x.test <- function(df, x){ 
  out <- with(df, mean(x))
  return(out)
}    
x.test(iris, "Sepal.Length")

此输出为NA,并带有警告消息。但是,如果我在没有该功能的情况下执行相同的程序,它似乎工作正常。

with(iris, mean(Sepal.Length))

我显然在这里遗漏了一些东西 - 非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

您已经获得了正确的建议(使用&#34; [&#34;或&#34; [[&#34;而不是with内部功能)但它也可能有助于思考问题发生的原因。在with内,您要求mean函数返回字符向量的均值,因此NA就是结果。当你在交互级别使用时,你在列的字符名称周围没有引号,如果你有,你会得到相同的结果:

> with(iris, mean('Sepal.Length'))
[1] NA
Warning message:
In mean.default("Sepal.Length") :
  argument is not numeric or logical: returning NA

如果您使用R get机制进行&#34;促销&#34;一个字符对象,用于返回实际上已经成功的命名对象的结果,尽管通常不推荐with用于编程:

x.test <- function(df, x){ 
   out <- with(df, mean( get(x)) )    #  get() retrieves the named object from the workspace
   return(out)
 }    
 x.test(iris, "Sepal.Length")
#[1] 5.843333

请参阅?with页面的“详细信息”部分,了解有关其在函数中使用的警告。

答案 1 :(得分:0)

这将有效

data(iris)
x.test <- function(df, x){ 
  out <- mean(df[, x])
  return(out)
}    
x.test(iris, "Sepal.Length")

您的代码正在尝试mean("Sepal.Length"),这显然不是您想要的。