2012-01-27 50 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

相關問題