作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
已经有很多关于范围、环境和功能的讨论。见例如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)
检索对象
d
来自环境
here
.所以,结果应该是
1
.但是,返回错误,说
Error in eval(substitute(expr), data, enclos = parent.frame()) :
invalid 'envir' argument of type 'closure'
ddply
-声明成
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
,我认为这不是很优雅。
最佳答案
唤醒惰性求值并确保您使用的是本地 d
参数,使用 force
.添加这一行:
d <- force(d)
myfun
.
ddply
评价不标准,只看里面
df
应用转换时的变量,所以它看不到本地
d
即使你
force
它。正如哈德利指出的,你需要包装
transform
insdie 调用
here
.
myfun <- function(df, d){
require(plyr)
new.dat <- ddply(df, .(id), here(transform), x=x*d)
return(new.dat)}
require
的情况没有做任何事情返回
FALSE
,你应该把它换成
library
.
mutate
是
transform
替代品的改进型替代品.
return
.
myfun <- function(df, d){
library(plyr)
ddply(df, .(id), here(mutate), x=x*d)}
关于r - 再次 : Setting the environment within a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24587341/
我是一名优秀的程序员,十分优秀!