首页 > 解决方案 > 将向量和单行数据框组合成一个列表

问题描述

我正在尝试从一个向量和一行数据框中组装一个列表。该列表将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 创建。

标签: r

解决方案


推荐阅读