如果我在R
中有一个功能f <- function(){
x <- 3
}
然后当我在交互式会话中执行该功能时,就像这样
> f()
>
变量x未定义/可访问
> x
Error: object 'x' not found
>
有没有办法执行f,就像将函数的内容逐行输入交互式会话一样?
编辑:这就是我想要这个功能的原因。我有一组脚本,用于半自动化多步骤分析工作流程。要使用它们,我通常会提供脚本,并使用预处理数据初始化会话。然后我可以从那里以交互方式继续分析。为了将元数据附加到脚本,我将分析脚本包装为实现基类的S4对象。目前,我在一个名为run()的成员函数中可以执行每个脚本的内容。问题在于,虽然我可以执行run()函数来执行初始分析计算,但它无法使用预处理数据设置环境。
答案 0 :(得分:3)
不,我不相信这是可能的。 更新好吧,我现在相信 可能。见下文。
执行函数f
时,会创建一个最初具有参数值的本地环境(在您的情况下为none)。 x
的分配发生在当地环境中。
如果您修改f
,您可以实现您想要的效果。以下是几种选择:
# Simply return the value:
f <- function() {
x <- 3
x # returns x. return(x) also works fine.
}
f() # returns 3
# Assign to global env
f <- function() {
x <<- 3 # Assigns in global env - but see help("<<-") for details
}
f()
x # 3
# Return the local environment
f <- function(foo=13) {
x <- 3 # local assignment
environment() # return the local environment
}
e <- f()
e$x # 3
e$foo # 13
请注意,原始版本的f
也返回3,但隐身 - 分配的默认结果是不可见的值。还有一个特殊功能invisible
:
f <- function(){
x <- 3
}
print( f() ) # 3
a <- f()
a # 3
invisible(42) # won't show...
print( invisible(42) ) # ...but it's there!
更新多想一想,当然有可能。 让我们做一个稍微有趣的功能:
f <- function(a, b) {
cat("I got",a,"and",b,"\n")
x <- a+b
}
# Ensure there is no x to prove that the following works...
rm(x)
# First assign the input parameters to f.
a <- 5
b <- 3
# Then evaluate the body.
eval(body(f))
x # 8