r - 函数内 ddply 未找到对象错误

标签 r function scope plyr

这确实挑战了我调试 R 代码的能力。

我想使用ddply()将相同的函数应用于按顺序命名的不同列;例如。 a、b、c。为此,我打算将列名作为字符串重复传递,并使用 eval(parse(text=ColName)) 允许函数引用它。我从另一个答案中获取了这项技术。

这工作得很好,直到我将 ddply() 放入另一个函数中。这是示例代码:

# Required packages:
library(plyr)

myFunction <- function(x, y){
    NewColName = "a"
    z = ddply(x, y, summarize,
            Ave = mean(eval(parse(text=NewColName)), na.rm=TRUE)
    )
    return(z)
}

a = c(1,2,3,4)
b = c(0,0,1,1)
c = c(5,6,7,8)
df = data.frame(a,b,c)
sv = c("b")

#This works.
ColName = "a"
ddply(df, sv, summarize,
        Ave = mean(eval(parse(text=ColName)), na.rm=TRUE)
)

#This doesn't work
#Produces error: "Error in parse(text = NewColName) : object 'NewColName' not found"
myFunction(df,sv)

#Output in both cases should be
#  b Ave
#1 0 1.5
#2 1 3.5

有什么想法吗? NewColName 甚至是在函数内部定义的!

我想这个问题的答案,loops-to-create-new-variables-in-ddply ,可能对我有帮助,但今天我已经够头疼了,是时候举手寻求帮助了。

最佳答案

今天这个问题的解决方案是把summarize变成here(summarize)。例如

myFunction <- function(x, y){
    NewColName = "a"
    z = ddply(x, y, here(summarize),
            Ave = mean(eval(parse(text=NewColName)), na.rm=TRUE)
    )
    return(z)
}

here(f) 于 2012 年 12 月添加到 plyr,捕获当前上下文。

关于r - 函数内 ddply 未找到对象错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6955128/

相关文章:

r - `[[` 在这个 sapply 示例中寻找什么?

磁盘上的 R h2o 模型大小

Javascript 函数查找数字的倍数

r - 在 R6 类上实现 S3 调度的正确方法

r - 在 R 中绑定(bind)外部变量

c - 为什么在c中使用函数返回指针及函数返回指针的应用

python - 限制 Python 函数/方法返回的值的数量

javascript - Javascript 中的返回值和变量范围

c++ - 离开范围时析构函数调用的顺序? (C++)

c++ - 为什么不能在 C++ 类中重新定义类型名称?