在函数内使用 ddply 找不到对象错误 [英] Object not found error with ddply inside a function
问题描述
这确实挑战了我调试 R 代码的能力.
This has really challenged my ability to debug R code.
我想使用 ddply()
将相同的函数应用到按顺序命名的不同列;例如.a、b、c.为此,我打算将列名作为字符串重复传递,并使用 eval(parse(text=ColName))
允许函数引用它.我从另一个答案中汲取了这种技巧.
I want to use ddply()
to apply the same functions to different columns that are sequentially named; eg. a, b, c. To do this I intend to repeatedly pass the column name as a string and use the eval(parse(text=ColName))
to allow the function to reference it. I grabbed this technique from another answer.
这很有效,直到我将 ddply()
放入另一个函数中.这是示例代码:
And this works well, until I put ddply()
inside another function. Here is the sample code:
# 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 甚至是在函数内部定义的!
Any ideas? NewColName is even defined inside the function!
我想到了这个问题的答案,loops-to-create-new-variables-in-ddply,可能对我有帮助,但我今天已经受够了,是时候举手寻求帮助了.
I thought the answer to this question, loops-to-create-new-variables-in-ddply, might help me but I've done enough head banging for today and it's time to raise my hand and ask for help.
推荐答案
您可以使用 do.call
和 call
的组合来构造调用NewColName
仍然可见的环境:
You can do this with a combination of do.call
and call
to construct the call in an environment where NewColName
is still visible:
myFunction <- function(x,y){
NewColName <- "a"
z <- do.call("ddply",list(x, y, summarize, Ave = call("mean",as.symbol(NewColName),na.rm=TRUE)))
return(z)
}
myFunction(d.f,sv)
b Ave
1 0 1.5
2 1 3.5
这篇关于在函数内使用 ddply 找不到对象错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!