R执行功能,就好像它是在交互式会话中输入的一样

时间:2012-01-27 15:50:32

标签: r

如果我在R

中有一个功能
f <- function(){
    x <- 3
}

然后当我在交互式会话中执行该功能时,就像这样

> f()
>

变量x未定义/可访问

> x
Error: object 'x' not found
>

有没有办法执行f,就像将函数的内容逐行输入交互式会话一样?

编辑:这就是我想要这个功能的原因。我有一组脚本,用于半自动化多步骤分析工作流程。要使用它们,我通常会提供脚本,并使用预处理数据初始化会话。然后我可以从那里以交互方式继续分析。

为了将元数据附加到脚本,我将分析脚本包装为实现基类的S4对象。目前,我在一个名为run()的成员函数中可以执行每个脚本的内容。问题在于,虽然我可以执行run()函数来执行初始分析计算,但它无法使用预处理数据设置环境。

1 个答案:

答案 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