【发布时间】:2018-05-31 09:20:05
【问题描述】:
遵循dplyr::case_when() 文档中给出的示例:
x <- 1:50
case_when(x %% 35 == 0 ~ "fizz buzz",
x %% 5 == 0 ~ "fizz",
x %% 7 == 0 ~ "buzz",
TRUE ~ as.character(x))
我希望数字 35 会产生 "buzz" 但它会产生 "fizz buzz"
我的理由是case_when() 会逐一评估所有语句,无论前一个语句是否为真(因为它确实评估了最后一个语句 TRUE ~ as.character(x))并且35 %% 7 显然是 0。
我错过了什么?
【问题讨论】:
-
语句按顺序求值,任何与第一个语句匹配的都会得到第一个结果,不会被后面的结果覆盖。
-
我仍然对为什么最后一条语句 TRUE ~ as.character(x) 被评估感到困惑。
-
有
x值不能被 35、5 或 7 整除 - 因此在处理前 3 个语句后仍有值需要处理。如果您仍然感到困惑,您可以尝试更详细地解释为什么您认为应该发生其他事情吗? -
@Marius 我对这个 TRUE ~ as.character(x) 感到困惑,因为在我看来它适用于整个 x。我知道这是一种拥有“其他”条款的方式。
-
它适用于整个
x除了,其他情况胜出。当多个案例为真时,第一个列出“获胜”。所以当使用TRUE ~时,重要的是它被列在最后,否则它之后列出的案例永远不会赢。