Я хотел бы передать однострочный блок/кадр данных 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()
должен быть необходим в этой ситуации, так как я не итерирую.
Подозреваю, что упускаю что-то очень простое.
Это хлопотно и неэстетично помещать
unlist()
вокруг каждой ссылки на переменную. В моем реальном случае есть много переменных. То же самое с[[]]
.Каков фактический желаемый результат. если вы используете
dplyr::rowwise()
, они не выглядят как списки:foo_tibble %>% rowwise() %>% mutate(is.list(varr))
желаемым выводом будет то, что
is.list(varr)
возвращает false внутриfoo_func
.@ РонакШах, да.
почему
unlist
не требуется в конструкцииpmap
? Думаю, я надеялся воспроизвести это поведение, но менее подробно.Я думаю, вы, вероятно, ищете
unlist(data, recursive = FALSE)
(илиpurrr::flatten()
).foo_func <- function(data) with(unlist(data, recursive = FALSE), {print(is.list(varr)); print(is.list(var2))} )
@ 27ϕ9, похоже, это работает. Я мог бы поклясться, что это была одна из первых вещей, которые я попробовал, и это не сработало. Я, должно быть, неправильно расставил скобки. Не стесняйтесь публиковать в качестве ответа.