我運行了一些舊代碼來清理它,看到一個舊代碼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
}
uj5u.com熱心網友回復:
這樣做的另一種方法:
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
我相信這更清潔......
uj5u.com熱心網友回復:
不,它們不一樣
它們不同的原因是因為|運算子總是計算兩邊的運算元。但是,在if(x) else if(y)塊中,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行為方式一致。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/333569.html
