【发布时间】:2014-07-05 14:21:31
【问题描述】:
已经有很多关于范围、环境和功能的讨论。参见例如here 或 here。但是,我不确定我是否找到了解决以下问题的好方法:
df <- data.frame(id=rep(LETTERS[1:2],each=2), x=1:4)
d <- -1
myfun <- function(df, d){
require(plyr)
new.dat <- ddply(df, .(id), transform, x=x*d)
return(new.dat)}
myfun(df, 1)
您可以轻松验证是否使用了全局定义的d=-1,而不是参数中提供的d=1。 (如果不存在全局定义的d,则返回object not found 消息)现在最大的问题是:如何将d 用于函数的参数而不是全局定义的d?
我的印象是以下应该可以工作:
myfun2 <- function(df, d){
here <- environment()
new.dat <- ddply(df, .(id), transform, x=x*with(here,d))
return(new.dat)}
myfun2(df, 1)
据我了解,with(here, d) 从环境here 中检索对象d。所以,结果应该是1。但是,返回一个错误,说
Error in eval(substitute(expr), data, enclos = parent.frame()) :
invalid 'envir' argument of type 'closure'
我不确定我是否理解为什么这不起作用,如果有人能对此有所了解,或者如果你能提供替代解决方案,我会很高兴。请注意,将整个 ddply-statement 包装到 with(...) 似乎也没有帮助。
一个可行的解决方案是attach函数内的当前环境:
myfun3 <- function(df, d){
here <- environment()
attach(here)
new.dat <- ddply(df, .(id), transform, x=x*d)
detach(here)
return(new.dat)
}
但我不喜欢这个解决方案,因为它通过用本地 d 屏蔽全局定义的 d 来工作,我认为这不是很优雅。
感谢任何 cmets / 指针。
【问题讨论】:
-
new.dat <- ddply(df, .(id), function(x,d){x<-x*d}, d)有点作品,但不完全
标签: r function plyr environment