在函数中,是否可以`return(eval(expr))`

时间:2014-06-24 05:36:30

标签: r

我正在尝试使用以下代码执行类似函数内的全局赋值(例如使用... <<- ...),

test_function = function(){
 return(eval(parse(text = "test <- 4^2"))) 
}
test_function()

调用环境16中的testtest_function

然而

test_function = function(){
  return(expression(test <- 4^2)) 
}

eval(test_function())

确实!

有没有做过前者而不诉诸后者?

3 个答案:

答案 0 :(得分:3)

嗯,我会小心的。如果你这样做了

test_function = function(){
 test <- 4^2
}

该值也不会出现在全局环境中,而这基本上就是您在第一个函数中所做的事情。注意

test_function = function(){
 return(eval(parse(text = "test <- 4^2"))) 
}
print(test_function())
# [1] 16

返回16,因此赋值在函数范围内正如预期的那样发生并被返回。没有理由认为会有任何不同。如果您想在父范围内进行评估,那么请明确它

test_function = function(){
 return(eval(parse(text = "test <- 4^2"), parent.frame())) 
}
test_function()

或者如果您想要始终在全球环境中操作,请指定

test_function = function(){
 return(eval(parse(text = "test <- 4^2"), globalenv()) 
}
test_function()

但实际上这似乎是一个糟糕的设计决定。对于具有类似全局副作用的函数来说,这是不礼貌的。确保这对您的应用程序是绝对必要的,并且您没有其他选择。

答案 1 :(得分:2)

eval.parent可能是一种“更安全”的方法,如果你想分配到test_function的调用框架中。

test_function = function(){
    eval.parent(quote(test <- 4^2))
}
test_function()
test
# [1] 16

答案 2 :(得分:1)

您可以将assign()与父框架的分配一起使用

> test_function <- function(){
      assign("test", 4^2, parent.frame()) 
  }
> test_function()
> test
[1] 16