这个失败了:
library(tidyverse)
myFn <- function(nmbr){
case_when(
nmbr > 3 ~ letters[1:3],
TRUE ~ letters[1:2]
)
}
myFn(4)
# Error: `TRUE ~ letters[1:2]` must be length 3 or one, not 2
# Run `rlang::last_error()` to see where the error occurred.
为什么会失败?为什么case_when
的分支不能返回长度不同的向量?我想让myFn
正常工作,这样我就可以做如下操作:
tibble(fruit = c("apple", "grape"),
count = 3:4) %>%
mutate(bowl = myFn(count)) %>%
unnest(col = "bowl")
并获得
# A tibble: 5 x 3
fruit count bowl
<chr> <int> <int>
1 apple 3 a
2 apple 3 b
3 grape 4 a
4 grape 4 b
5 grape 4 c
我可以通过编写不使用向量化的 myFn
,并在其中使用 if/else
,然后将其包装在 map
中,使其工作,但为什么我必须这样做呢?
data.frame
(因此tibble)的一个基本原则是每列长度完全相同。 - r2evansmutate
中的调用必须始终返回与输入行数相同的长度(或 1),而summarise
必须始终返回长度为 1。 - r2evansdplyr
出现之前写的,所以它无法讨论case_when
或recode
等内容。 - David T