gpt4 book ai didi

r - 为什么 case_when 不能返回不同长度的向量?

转载 作者:行者123 更新时间:2023-12-05 02:53:47 26 4
gpt4 key购买 nike

这失败了:

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

我可以让它工作 - 通过使用 if/else 编写一个非向量化的 myFn,然后将它包装在 map 中,但是为什么我必须这样做?

最佳答案

根据我的意见,您的函数需要为每一行输入返回一个元素。但是,这些元素中的每一个都可以是长度为 0 或更长(任意复杂度)的 list。试试这个:

myFn <- function(nmbr){
case_when(
nmbr > 3 ~ list(letters[1:3]),
TRUE ~ list(letters[1:2])
)
}
tibble(fruit = c("apple", "grape"),
count = 3:4) %>%
mutate(bowl = myFn(count))
# # A tibble: 2 x 3
# fruit count bowl
# <chr> <int> <list>
# 1 apple 3 <chr [2]>
# 2 grape 4 <chr [3]>
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> <chr>
# 1 apple 3 a
# 2 apple 3 b
# 3 grape 4 a
# 4 grape 4 b
# 5 grape 4 c

关于r - 为什么 case_when 不能返回不同长度的向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62005334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com