2017-06-16 78 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

这太棒了!我学到了一个新功能。 =) –

相关问题