dplyr::case_when() 中的评估
Evaluation in dplyr::case_when()
遵循 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。
我错过了什么?
case_when() evaluates all statements one by one regardless if a previous one is true or not (since it does evaluate TRUE ~ as.character(x) which is the last one)
这是误导,case_when()
的输出是基于第一个正确的陈述。
TRUE ~ as.character(x)
表示如果 x 不能被 5 或 7 整除,则 x 将作为字符串返回,即对于 x = 5,将返回“5”。
如果 x 可以被 5 或 7 整除,casewhen()
不评估后续情况。 "fizz" 和 "buzz" 不是 传递给 as.character(x)
并且它们不必传递给 as.character(x)
,因为它们已经是字符串。
遵循 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。
我错过了什么?
case_when() evaluates all statements one by one regardless if a previous one is true or not (since it does evaluate TRUE ~ as.character(x) which is the last one)
这是误导,case_when()
的输出是基于第一个正确的陈述。
TRUE ~ as.character(x)
表示如果 x 不能被 5 或 7 整除,则 x 将作为字符串返回,即对于 x = 5,将返回“5”。
如果 x 可以被 5 或 7 整除,casewhen()
不评估后续情况。 "fizz" 和 "buzz" 不是 传递给 as.character(x)
并且它们不必传递给 as.character(x)
,因为它们已经是字符串。