我正在尝试使用以下代码执行类似函数内的全局赋值(例如使用... <<- ...
),
test_function = function(){
return(eval(parse(text = "test <- 4^2")))
}
test_function()
调用环境16
中的test
到test_function
。
然而
test_function = function(){
return(expression(test <- 4^2))
}
eval(test_function())
确实!
有没有做过前者而不诉诸后者?
答案 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