[英]R: "if else if" vs "or" with three cases
我运行了一些旧代码来清理它,并看到一个旧的if else if statement
在我脑海中提出了一个问题; 这是一个超级简单的逻辑问题,但为了我自己的启迪,并确保我在逻辑上思考这个问题,我想看看是否从“旧方式”转变为“新方式”,至少在本质上对于这种情况,应该是一样的。 我的问题是:这两种做这件事的方法本质上是一样的吗?
#old way
df_test = tibble::as_tibble(data.frame(column1 = NA))
if(NROW(df_test$column1) == 0) {
df_test = TRUE
} else if (all(is.na(df_test$column1))) {
df_test = TRUE
} else {
df_test = FALSE
}
#new way
df_test = tibble::as_tibble(data.frame(column1 = NA))
if(NROW(df_test$column1) == 0 | all(is.na(df_test$column1))) {
df_test = TRUE
} else {
df_test = FALSE
}
我的问题是:这两种做这件事的方法本质上是一样的吗?
对,他们是。
看到这一点,需要注意的是在第一个代码块, TRUE
是,如果返回要么NROW(df_test$column1) == 0
或者如果all(is.na(df_test$column1)) == TRUE
。
因此,第一个if .... else if
可以被替换为
if(NROW(df_test$column1) == 0 | all(is.na(df_test$column1)))
然后紧接着是第二个代码块。
这样做的另一种方法:
df_test = tibble::as_tibble(data.frame(column1 = NA))
df_test <- ifelse(NROW(df_test$column1) == 0 | all(is.na(df_test$column1)), TRUE, FALSE)
df_test
我相信这更清洁......
它们不同的原因是因为|
运算符总是计算两边的操作数。 但是,在if(x) else if(y)
块中,如果第一个if
为真,则不会评估第二个if
。 如果被测试的表达式涉及副作用,则差异尤其重要,例如,如果您正在修改文件。
另一个区别是|
被向量化,即如果其操作数是向量,则返回真/假值的向量。 在if
块的上下文中,这通常不是您想要的, if
返回长度大于 1 的向量,R 将发出警告。
简化示例:
foo <- function()
{
print("in foo")
TRUE
}
bar <- function()
{
print("in bar")
TRUE
}
# case 1
if(foo()) x <- 1 else if(bar()) x <- 1
# case 2
if(foo() | bar()) x <- 1
第一种情况只会打印出"in foo"
。 第二种情况将打印"in foo"
后跟"in bar"
。
如果要折叠 if 块,请使用||
,不是|
. 如果左侧为假,这只会评估右侧的操作数,并且也只返回标量值,而不是向量。 这与if
行为方式一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.