2012-01-27 48 views
2

,如果我有R中R作为好像它是在交互式会话进入执行功能

f <- function(){ 
    x <- 3 
} 

那么功能,当我在交互式会话中执行的功能,这样

> f() 
> 

的变量x未定义/可访问

> x 
Error: object 'x' not found 
> 

有没有一种方法来执行f,就好像函数的内容w是否逐行进入交互式会话?

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

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

+1

为什么你想这样做? – 2012-01-27 15:53:56

+0

同意w/DHeffernan。如果你想从函数环境返回一个变量,在函数内部使用'return(x)'。 (或者做可变环境分配的复杂事情) – 2012-01-27 16:05:41

+0

我想知道你最近想做的事情是把你的代码放在一个脚本文件中,而不是一个函数,然后'source()'它? – joran 2012-01-27 16:10:45

回答

3

不,我不相信这是可能的。 UPDATE嗯,我现在认为它可能。见下文。

执行功能f时,会创建一个本地环境,该环境最初具有参数值(在您的情况下为无)。 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! 

UPDATE关于它的思考多一点,当然这是可能的。 让我们做一个更有趣的功能:

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 
+0

eval(body(f))是完美的谢谢! – momeara 2012-01-27 16:43:00

相关问题