2012-12-19 128 views
1

我有以下功能:在一個函數中設置一個全局變量

s_c <- function(n, t){ 
    r_num <- runif(1,min=0,max=1) 
    use <- sample(s[,1],1) 
    use2 <- subset(s,s[,1]==use,2) 
    use2 <- as.numeric(use2) 
    ne_s <- sample(subset(s,s[,2]!=use2,2),1) 

    Return(use) 
    if (t>50 & r_num<0.5){ 
     ne_s 
    } 
     else 
      0 
} 

我真的喜歡使用的功能以外的功能命令創建的變量,所以我想「迴歸「在能指變量函數外感

問題2:

如果我想的if語句中做一個任務,例如

if (t>50 & r_num<0.5){ 
     s[,4]=use 
    } 

可以這樣做嗎?

+0

你想返回兩個值嗎? –

+0

我實際上希望在函數外使用在函數中創建的變量,所以我希望能夠引用函數外部的變量「返回」 – user1723765

+0

您的意思是說你想要這個函數修改另一個函數中的局部變量? –

回答

3

雖然您應該將這兩個值作爲列表返回,但您可以非常輕鬆地影響父級的環境。

替換此:

Return(use) 

與此:

use <<- use 

爲了您的編輯,你可以使用語法:

s[,4] <<- use 

注: 「父母的環境」 是不是函數被調用的環境。這是功能定義的環境。正因爲如此,R中的函數被稱爲閉包。明確:

s_c <- function() { 
    use <<- 1 
} 

f <- function() { 
    use <- 0 
    s_c() 
    return(use) 
} 

f()將返回0。s_c()被修改不同use變量(在不同的環境中)。

+6

以外的程序內,這通常不是一個好主意待辦事項,變量變量。它會創建緊密耦合的代碼,否定使用函數的整個想法。 –

+0

以及如果我想在IF語句中進行賦值,例如,如果某些條件成立,我想爲外部變量賦予一個新值 – user1723765

+2

您可以。問題是你是否應該。例如,如果您從另一個函數調用該函數,可能會發生意想不到的事情(當然取決於您的期望)。 –

4

由馬修所說的 「名單」 的解決方案:

.....

list(variable1 = VarInFunction, 
    variable2 = VarInFunction2) 

這樣,當你運行你的功能,你可以存儲它的結果。

Result <- s_c(10,1) 

然後你可以問結果明確,如:

Result$variable1 
Result$variable2 

注意VarInFunction是因爲它是在函數中調用的變量,並更名爲variable1(或任何你想要的),和存儲在Result

+1

這裏非常重要的區別在於,您可以在您的環境中運行其他變量的零風險。我知道你想用's'來更新值,但是一旦你這樣做了,你永遠無法得到原始值。作爲在函數之外更新變量的一種替代方法,可以考慮一個像's_temp < - s_c(n,t)這樣的腳本; s.old <-s; s <-s_temp'。 –

相關問題