r - 将向量和单行数据框组合成一个列表
问题描述
我正在尝试从一个向量和一行数据框中组装一个列表。该列表将do.call()
作为参数传递给函数。如果向量长度为 1,则没有问题。
tbl <- tibble::tibble(a = 1:4,
b = letters[1:4])
vec <- 1
works <- c(avec = vec, as.list(tbl[1,]))
testit <- function(avec, a, b){
length(avec) + length(a) + length(b)
}
do.call(testit, works)
#> [1] 3
但它也需要使用更长的向量
vec <- 1:2
broken <- c(avec = vec, as.list(tbl[2,]))# breaks apart avec
do.call(testit, broken)
#> Error in (function (avec, a, b) : unused arguments (avec1 = 1, avec2 = 2)
toomany <- list(avec = vec, as.list(tbl[2,]))#too many layers
do.call(testit, toomany)
#> Error in (function (avec, a, b) : argument "b" is missing, with no default
#what I want:
whatIwant <- list(avec = 1:2, a = 2, b = "b")
do.call(testit, whatIwant)
#> [1] 4
数据框是否无关紧要,我希望解决方案无论如何都可以同时使用小标题和数据框。
adf <- data.frame(a = 1:4,
b = letters[1:4], stringsAsFactors = FALSE)
list(avec = vec, as.list(adf[1,]))
#> $avec
#> [1] 1 2
#>
#> [[2]]
#> [[2]]$a
#> [1] 1
#>
#> [[2]]$b
#> [1] "a"
我尝试过的其他事情。
purrr::flatten(toomany) # breaks up avec again
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 2
#>
#> $a
#> [1] 2
#>
#> $b
#> [1] "b"
c(avec = vec, as.list(adf[1,]), recursive = TRUE)
#> avec1 avec2 a b
#> "1" "2" "1" "a"
list(avec = vec, as.vector(adf[1,]))
#> $avec
#> [1] 1 2
#>
#> [[2]]
#> a b
#> 1 1 a
list(vec, unlist(adf[1,]))
#> [[1]]
#> [1] 1 2
#>
#> [[2]]
#> a b
#> "1" "a"
我没想到这会这么难!我是否必须将列表组合成文本并进行解析?我错过了一些东西。由 reprex 包(v0.2.0) 于 2019-03-01 创建。
解决方案
推荐阅读
- html - 为什么 (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px) 在 Sassmeister 中不是一个有效的 CSS 值?
- python - 在 Python 中读取非标准文本文件
- android - Xamarin Android - TextView 中的白色文本显示为灰色而不是白色
- python - 行/列切片scipy.sparse.csc_matrix中的内存效率低下
- reactjs - 将重定向与 history.push 一起使用时无法更改状态
- python - 使用 str.contains 查找部分字符串
- websocket - asyncio :: 访问在另一个循环中创建的 websocket
- android - 在 Android 设备上捕获 USB 流量
- promise - 为抛出错误的异步函数编写 Jest 测试失败
- docker - 在端到端测试期间,OpenShift 上的赛普拉斯(电子)错误“无法获取 'appData' 路径”