Тиббл конвейера со списком логических векторов для map2 ()

Как я могу передать кадр данных, состоящий из списка логических векторов и списка векторов символов, в purrr::map2() для подмножества векторов символов с помощью логических векторов?

Мои усилия работают без каналов, но я не уверен, как это сделать с трубами:

Например, используя этот фрейм данных:

a_pair = tibble(mask = list(TRUE, c(FALSE, TRUE), TRUE, TRUE, 
                            c(FALSE, FALSE, FALSE, TRUE), TRUE, TRUE, TRUE, 
                            TRUE, c(FALSE, FALSE, FALSE, TRUE)),
                strings = list(".", c("0.29966", "0.31145"), "0.48243", 
                               "0.55122", 
                               c("0.10099", "0.10142", "0.49873", "0.56246"), 
                               "0.56246", "0.10127", "0.70687", "0.68338", 
                               c("0.03365", "0.16895", "0.68338", "0.82954")))

Это работает:

library(purrr)

map2(a_pair$mask, a_pair$strings, function(logical, string) subset(string, logical))

Но это (как предлагается в связанном вопрос) нет:

a_pair %>% map2(., names(.), ~{subset(.y, .x)})
Error in subset.default(.y, .x) : 'subset' must be logical

Мне нужно сделать какое-то исключение из списка или по-другому ссылаться на логические векторы?


person bheavner    schedule 15.09.2017    source источник
comment
Почему вы хотите сделать это в трубе? Объект a_pair появляется дважды в выражении, которое работает, поэтому любой канал должен быть сложным. Каналы хороши, когда LHS является первым аргументом RHS, и нормально, когда LHS появляется один раз в RHS, но они нечитаемы, когда все становится более сложным.   -  person user2554330    schedule 15.09.2017
comment
Честно говоря, у меня он работает без него, и это нормально для моих непосредственных нужд, в основном потому, что мне любопытно, как это сделать с трубкой!   -  person bheavner    schedule 15.09.2017


Ответы (1)


Вы должны использовать

library(dplyr)
a_pair %>% {map2(.$strings, .$mask, subset)}

Использование {} помогает предотвратить автоматическую передачу данных в качестве первого параметра.

Или, если вы включите библиотеку magrittr, вы можете сделать

library(magrittr)
a_pair %$% map2(strings, mask, subset)
person MrFlick    schedule 15.09.2017