передать строку таблицы именованной функции в виде именованных векторов, не перечисленных в списке, включая столбцы списка

avatar
lost
9 августа 2021 в 05:06
94
0
0

Я хотел бы передать однострочный блок/кадр данных foo_tibble в foo_func и чтобы каждый столбец foo_tibble, включая столбцы списка, был незарегистрированным вектором при ссылке внутри foo_func по имени столбца.

Ближайшее, что я получил, это следующее:

library(tidyverse)

foo_tibble <- tibble(varr = list(c("A", "B")),
                     var2 = list(c(1, 2, 3)))
# actual case has many more variables which need to be referenced by name in foo_func()

foo_func <- function(...) {
  with(...  {
    print(varr)
    is.list(varr)
    # various arbitrary operations involving different columns here
    })
}

foo_tibble %>%
  foo_func()
#> [[1]]
#> [1] "A" "B"
#> [1] TRUE

Но здесь varr распознается как список (длиной 1) вместо простого вектора. Я не хочу помещать unlist() вокруг каждого имени столбца, когда я его использую.

Я знаю, что один из способов добиться того, что я хочу, это использовать анонимную функцию внутри pmap(), например:

foo_tibble %>%
  pmap(.  ~with(list(...), {
    print(varr)
    is.list(varr)
  }))
#> [1] "A" "B"
#> [[1]]
#> [1] FALSE

Я часто использую этот тип построения, например, когда мне нужно перебрать много строк. Но в моей нынешней ситуации мне нужно сделать это только с одной строкой в ​​данный момент времени, и я ищу что-то более простое. Я не думаю, что pmap() должен быть необходим в этой ситуации, так как я не итерирую.

Подозреваю, что упускаю что-то очень простое.

Источник
lost
9 августа 2021 в 05:17
0

Это хлопотно и неэстетично помещать unlist() вокруг каждой ссылки на переменную. В моем реальном случае есть много переменных. То же самое с [[]].

MrFlick
9 августа 2021 в 05:17
0

Каков фактический желаемый результат. если вы используете dplyr::rowwise(), они не выглядят как списки: foo_tibble %>% rowwise() %>% mutate(is.list(varr))

lost
9 августа 2021 в 05:18
0

желаемым выводом будет то, что is.list(varr) возвращает false внутри foo_func.

lost
9 августа 2021 в 05:19
0

@ РонакШах, да.

lost
9 августа 2021 в 05:26
0

почему unlist не требуется в конструкции pmap? Думаю, я надеялся воспроизвести это поведение, но менее подробно.

Ritchie Sacramento
9 августа 2021 в 06:22
3

Я думаю, вы, вероятно, ищете unlist(data, recursive = FALSE) (или purrr::flatten()). foo_func <- function(data) with(unlist(data, recursive = FALSE), {print(is.list(varr)); print(is.list(var2))} )

lost
9 августа 2021 в 06:42
0

@ 27ϕ9, похоже, это работает. Я мог бы поклясться, что это была одна из первых вещей, которые я попробовал, и это не сработало. Я, должно быть, неправильно расставил скобки. Не стесняйтесь публиковать в качестве ответа.

Ответы (0)