R 强制函数定义对符号求值
考虑下面的例子:R 强制函数定义对符号求值,r,R,考虑下面的例子: > x=2 > myfun = function(y) x*y > myfun(3) [1] 6 > x=4 > myfun(3) [1] 12 > foo <- myfun() 如何定义myfun,使其定义保持x的值与定义时相同,而不是引用x?(即,第二次调用myfun(3)也会产生6而不是12) 编辑:更改标题以删除不正确的术语。我得猜一猜你的目的是什么。也许您只需要使用默认值定义一个参数: myfun <- functi
> x=2
> myfun = function(y) x*y
> myfun(3)
[1] 6
> x=4
> myfun(3)
[1] 12
> foo <- myfun()
如何定义myfun
,使其定义保持x
的值与定义时相同,而不是引用x
?(即,第二次调用myfun(3)
也会产生6而不是12)
编辑:更改标题以删除不正确的术语。我得猜一猜你的目的是什么。也许您只需要使用默认值定义一个参数:
myfun <- function(y, x=2){
x * y
}
myfun我得猜一猜你的目的是什么。也许您只需要使用默认值定义一个参数:
myfun <- function(y, x=2){
x * y
}
myfun昨天在R-help邮件列表上问了几乎相同的问题。
请参阅关于Nabble的讨论,了解实现此目的的各种方法
以下是三种方法(从R-help讨论中收集):
xf3(3)
[1] 6
昨天,R-help邮件列表上提出了几乎相同的问题。
请参阅关于Nabble的讨论,了解实现此目的的各种方法
以下是三种方法(从R-help讨论中收集):
xf3(3)
[1] 6
一种方法是:
myfun <- function(x = 2) {
function(y) {
x * y
}
}
现在,无论您在全局环境中对x
执行什么操作foo()
都将始终使用调用该函数时在myfun()
环境中定义的x
值
> foo(3)
[1] 6
> x <- 6
> foo(3)
[1] 6
> x <- 4
> foo(3)
[1] 6
一种方法是:
myfun <- function(x = 2) {
function(y) {
x * y
}
}
现在,无论您在全局环境中对x
执行什么操作foo()
都将始终使用调用该函数时在myfun()
环境中定义的x
值
> foo(3)
[1] 6
> x <- 6
> foo(3)
[1] 6
> x <- 4
> foo(3)
[1] 6
下面是另一个解决方案:
myfun <- local({
x <- 2
list(
f=function(y) {
x*y
},
set.x=function(newx) {
x <<- newx
},
get.x=function() {
x
}
)
})
下面是另一个解决方案:
myfun <- local({
x <- 2
list(
f=function(y) {
x*y
},
set.x=function(newx) {
x <<- newx
},
get.x=function() {
x
}
)
})
这是可能的,但有点奇怪。你能解释一下你为什么要这样做吗?无论如何,你的标题是误导性的(或者可能是错误的)。您的功能是在环境链中查找值。这里没有引用任何东西。我同意@Andrie的观点,很难想象有这样的用例。也许你想要的是一个结束?可能是我的术语不正确。我所说的引用是指函数体包含“x”,而不是定义(2)时x所持有的值。我希望主体不包含“x”,即拍摄快照。你为什么认为这很奇怪?@AriB.Friedman Closures肯定能做到这一点。我可能会修改我的答案来反映这一点。@mitchus这有点奇怪,因为通常如果你想对一个变量值进行快照,你会在代码中这样做。这是可能的,但有点奇怪。你能解释一下你为什么要这样做吗?无论如何,你的标题是误导性的(或者可能是错误的)。您的功能是在环境链中查找值。这里没有引用任何东西。我同意@Andrie的观点,很难想象有这样的用例。也许你想要的是一个结束?可能是我的术语不正确。我所说的引用是指函数体包含“x”,而不是定义(2)时x所持有的值。我希望主体不包含“x”,即拍摄快照。你为什么认为这很奇怪?@AriB.Friedman Closures肯定能做到这一点。我可能会修改我的答案来反映这一点。@mitchus这有点奇怪,因为通常如果你想对一个变量值进行快照,你会在代码中这样做。这正是我想要的。顺便说一句,在此期间,我发现了第四种可能有点老套的方法:body(myfun)=eval(expression(parse(text=paste(x,“*y”)))
我建议您看看require(fortunes);《财富》(106)在考虑使用<代码> PARSER()/<代码>之前。有点不那么可怕:formals(myfun)$x=x
这正是我想要的。顺便说一句,在此期间,我发现了第四种可能有点老套的方法:body(myfun)=eval(expression(parse(text=paste(x,“*y”)))
我建议您看看require(fortunes);《财富》(106)在考虑使用<代码> PARSER()/<代码>之前。有点不那么可怕:formals(myfun)$x=x
谢谢你的回复。问题是,在编写代码时,我不知道定义myfun
时x
的值(与我选择不当的示例所暗示的不同)。感谢您的回复。问题是,在编写代码时,我不知道定义myfun
时x
的值(与我选择不当的示例所暗示的不同)。
> environment(foo)$x
[1] 2
myfun <- local({
x <- 2
list(
f=function(y) {
x*y
},
set.x=function(newx) {
x <<- newx
},
get.x=function() {
x
}
)
})
> myfun$get.x()
[1] 2
> myfun$set.x(5)
> myfun$get.x()
[1] 5
> myfun$f(3)
[1] 15