2017-06-16 73 views
0

我在RStudio中創建了一個非常簡單的if ... else語句,並遇到以下問題。我將不勝感激,如果你可能需要一些時間來看看這個: -一個非常簡單的if ... else語句產生意想不到的結果

(A)代碼: -

testing <- function(var1) { 
    if(var1 == "heart attack") { 
     col_no <- 11 
     col_no 
    } else if(var1 == "heart failure") { 
     col_no <- 17 
     col_no 
    } else if(var1 == "pneumonia") { 
     col_no <- 23 
     col_no 
    } else {"error"} 
} 

(B)輸出: -

testing("heart attack") 
# [1] 11 

col_no 
# Error: object 'col_no' not found 

testing("heart failure") 
# [1] 17 

col_no 
# Error: object 'col_no' not found 

testing("pneumonia") 
# [1] 23 

col_no 
# Error: object 'col_no' not found 

當我鍵入「測試(」心力衰竭「)」,我期待col_no的值是17而不是錯誤。

同樣,當我輸入「測試(」肺炎「)」,我期待col_no的值是23而不是錯誤。

請幫忙!

+4

對象'col_no '只對函數'testing()'是本地的。請閱讀R的範圍。您必須調用如下函數:'col_no < - testing(「heart attack」)' – jogo

+0

放入'col_no << - 11'以將函數對象分配給用戶環境。 –

+0

@AdamQuek不要這樣做,只是分配結果:'col_no < - testing(...)' – Cath

回答

-3

因爲您定義了一個函數(測試),所以變量col_no僅在此函數中可用,而不是在全局環境中可用。試試這個,那麼變量也是在全球環境中定義:

testing <- function(var1) { 
if(var1 == "heart attack") { 
    col_no <<- 11 
    col_no 
} else if(var1 == "heart failure") { 
    col_no <<- 17 
    col_no 
} else if(var1 == "pneumonia") { 
    col_no <<- 23 
    col_no 
} else {"error"} 
} 
+4

在函數內部進行全局分配是非常不明智的。最好的辦法就是分配功能 – Cath

+0

明智或不明智的回報......取決於上下文。一般用<< - 替換return()可能是一個壞主意。 – user3156848

+1

我很想知道一個明智的例子,在那之前,我會認爲這總是不明智的。引用比爾維納布爾斯的觀點,引自「財富(174)」:*「我希望」 - 從來沒有被髮明過,因爲它使語言的奧祕和危險特徵看起來是正常和合理的。如果你想啞將R/S轉換爲宏語言,這是您的操作員。「* – Cath

1

下面是使用switch一個更清晰的語法:

testing <- function(var1){ 
    switch(var1, 
     "heart attack" = 11, 
     "heart failure"= 17, 
     "pneumonia" = 23, 
     "error") 
} 

調用函數:

col_no <- testing("heart attack") 
col_no 
#[1] 11 
col_no <- testing("heart failure") 
col_no 
#[1] 17 
col_no <- testing("pneumonia") 
col_no 
#[1] 23 
col_no <- testing("flue") 
col_no 
#[1] "error" 
+1

...現在你必須調用'col_no < - testing(...)'這樣的函數,這是一個可能的好的解決方案,不需要改變OP的代碼。 – jogo

+0

這太棒了!我學到了一個新功能。 =) –

相關問題