r - 为什么 case_when 不能返回不同长度的向量?
问题描述
这失败了:
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
using if/else
,然后将它包装在 中map
,但我为什么要这样做?
解决方案
根据我的评论,您的函数需要为每一行输入返回一个元素。但是,这些元素中的每一个都可以是list
长度为 0 或更多(以及任意复杂度)的 a。尝试这个:
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
推荐阅读
- java - 我需要为android studio 4.0.1下载哪个版本的gradle版本
- opencv - Opencv找不到棋盘角
- c - cs50沙箱for循环问题
- python - Sqlite3:如何实现高性能读/写并发?
- javascript - Javascript ES6 - 在将函数或变量导入不同的 .js 文件之前等待模块完成执行
- node.js - 升级到 vue-cli-4 后,相对路径不再适用于标准导入
- python - 使用 pandas 数据集按功能分组。Cronbach's alpha 与 Python 中的分组数据集
- cmake - 缺少 clang 标头
- github - 打开拉取请求或更新 PR 分支时如何运行 GitHub 操作?
- python - 在 Markdown 到 HTML 转换后返回更改的文本