我有一個 ifelse 條件,我想years
從包 lubridate 回傳一個值。
但是,它確實在 ifelse 中回傳 0,我不知道為什么。
library(lubridate)
years(1)
[1] "1y 0m 0d 0H 0M 0S" # correct
years(2)
[1] "2y 0m 0d 0H 0M 0S" # correct
ifelse(1 == 1, years(1), years(2))
[1] 0 # wrong
誰能解釋為什么 ifelse 回傳 0?
uj5u.com熱心網友回復:
這就是它發生的原因。這是來自源代碼的底部ifelse
,它將在您的示例中運行。
ans <- test
len <- length(ans)
ypos <- which(test)
npos <- which(!test)
if (length(ypos) > 0L)
ans[ypos] <- rep(yes, length.out = len)[ypos]
if (length(npos) > 0L)
ans[npos] <- rep(no, length.out = len)[npos]
ans
該函式正在ans
逐個修改向量,而不是整個向量本身。因此,來自yes
和的屬性no
正在被洗掉。
ans <- TRUE
ans[1] <- years(1)
ans
# [1] 0
以下來自幫助檔案。“答案的模式將從邏輯強制”首先從yes
值開始。
mode(years(1))
# [1] "numeric"
價值
與來自 yes 或 no 值的測驗和資料值具有相同長度和屬性(包括維度和“類”)的向量。答案的模式將被強制從邏輯中獲取,以首先容納取自 yes 的任何值,然后容納取自 no 的任何值。
uj5u.com熱心網友回復:
由于它構造輸出的方式,ifelse
從向量中剝離屬性。這不是lubridate::year
. 例如,日期和日期時間也會發生這種情況
ifelse(1 == 1, as.Date("2022-06-24"), as.Date("2022-06-25"))
#> [1] 19167
使用dplyr::if_else
可以避免這個問題:
dplyr::if_else(1 == 1, years(1), years(2))
#> [1] "1y 0m 0d 0H 0M 0S"
顯然,低技術解決方案是:
years(ifelse(1 == 1, 1, 2))
#> [1] "1y 0m 0d 0H 0M 0S"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/496708.html