没有找到对象错误 ddply 在功能内

它真的挑战了我调试代码的能力。 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 甚至在功能内定义!

我认为这个问题的答案,
https://coderoad.ru/5873922/
, 它可以帮助我,但今天我已经遭受了足够的痛苦,现在是时候养手并寻求帮助。
已邀请:

龙天

赞同来自:

今天这个问题的决定是转向
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/

, 添加到 plyr 十二月 2012 年度,反映当前的背景。

詹大官人

赞同来自:

你可以用组合来做
do.call


call

, 在环境中建立挑战
NewColName

仍然可见:


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


summarize

或者
transform

或者其他东西,而且没有足够聪明地猜测各种环境中导航的所有融资,我倾向于绕过问题,只需使用
summarize

而是使用自己的匿名功能:


myFunction <- function/x, y/{
NewColName <- "a"
z <- ddply/x, y, .fun = function/xx,col/{
c/Ave = mean/xx[,col],na.rm=TRUE//},
NewColName/
return/z/
}

myFunction/df,sv/


显然,值得做的是 'manually', 但这常常避免与联盟产生的评估问题相关的头痛
ddply


summarize

. 当然,这并不意味着哈德利不会有决定......

知食

赞同来自:

问题是包代码 plyr. 在功能中 summary 有一个字符串
eval/substitute/.../,.data,parent.frame///

. 众所周知 parent.frame// 可以做出非常棒的事情和意想不到的事情。 T.

决定 @James - 这是一个非常好的解决方法,

但如果我记得正确,我自己 @Hadley 以前说过包装 plyr 不适用于功能。

对不起,我错了。 但是,众所周知,目前包装 plyr 在这些情况下创造问题。

因此,我给你一个基本解决这个问题的解决方案。 :


myFunction <- function/x, y/{
NewColName = "a"
z = aggregate/x[NewColName],x[y],mean,na.rm=TRUE/
return/z/
}
> myFunction/df,sv/
b a
1 0 1.5
2 1 3.5

冰洋

赞同来自:

似乎你有环境问题。 全球预约解决了这个问题,但他自己的灵魂的价格:


library/plyr/

a = c/1,2,3,4/
b = c/0,0,1,1/
c = c/5,6,7,8/
d.f = data.frame/a,b,c/
sv = c/"b"/

ColName = "a"
ddply/d.f, sv, summarize,
Ave = mean/eval/parse/text=ColName//, na.rm=TRUE/
/

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

myFunction/x=d.f,y=sv/



eval

看B. parent.frame/1/. 因此,如果你确定 NewColName 在......之外 MyFunction, 它应该工作:


rm/NewColName/
NewColName <- "a"
myFunction <- function/x, y/{

z = ddply/x, y, summarize,
Ave = mean/eval/parse/text=NewColName//, na.rm=TRUE/
/
return/z/
}
myFunction/x=d.f,y=sv/


使用
get

, 拔出 my.parse 从早期的环境中,我们可以更接近,但仍然必须通过 curenv 作为全球:


myFunction <- function/x, y/{
NewColName <- "a"
my.parse <- parse/text=NewColName/
print/my.parse/
curenv <<- environment//
print/curenv/

z = ddply/x, y, summarize,
Ave = mean/ eval/ get/"my.parse" , envir=curenv / /, na.rm=TRUE/
/
return/z/
}

> myFunction/x=d.f,y=sv/
expression/a/
<environment: 0x0275a9b4="">
b Ave
1 0 1.5
2 1 3.5


我怀疑
ddply

已经在评估中 .GlobalEnv, 因此,所有策略
parent.frame//


sys.frame//

, 我尝试过,失败了。
</environment:>

要回复问题请先登录注册