Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 强制函数定义对符号求值_R - Fatal编程技术网

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