Не удается получить доступ к строковым элементам из списка ввода в purr :: pmap или purr: map2 - PullRequest
0 голосов
/ 06 февраля 2019

У меня сложная проблема с доступом к строковым значениям списка в качестве аргумента для функций мурлыканья.

Моя цель - объединить все перестановки строковых элементов двух векторов (для использования в выходном имени файла)который я положил в один список ввода:

target.labels <- c("Prefix_A", "Prefix_B")
features.sets <- c("Suffix_X", "Suffix_Y")

input.list <- expand.grid(x=target.labels, y=features.sets)

Ожидаемый результат должен выглядеть следующим образом:

"Prefix_A-Suffix_X" "Prefix_B-Suffix_X" "Prefix_A-Suffix_Y" "Prefix_B-Suffix_Y"

Вот что я попробовал:

library(dplyr)
library(purrr)

fun1 <- function(x,y) { paste0(c(x, y), collapse = "-") }
fun2 <- function(x,y) { paste(x, y, sep = "-") }
fun3 <- function(x,y) { glue::glue("x = {x}, y = {y}") }


input.list %>% pmap_chr(fun1)
## [1] "1-1" "2-1" "1-2" "2-2"

input.list %>% pmap_chr(fun2)
## [1] "1-1" "2-1" "1-2" "2-2

input.list %>% pmap_chr(fun3)
## [1] "x = 1, y = 1" "x = 2, y = 1" "x = 1, y = 2" "x = 2, y = 2"

input.list %>% pmap_chr(~paste(.x, .y, sep = "-"))
## [1] "1-1" "2-1" "1-2" "2-2"

Как вы можетевидите, функции purr :: pmap получают только значения индекса элементов вместо строковых значений.С другой стороны, он может быть не специфичным для purr, так как функции apply показывают ту же проблему:

mapply(fun1, input.list$x, input.list$y)
## [1] "1-1" "2-1" "1-2" "2-2"

Одна догадка заключается в том, что скрытая функция c () в paste0 () или paste ()запрещает доступ к строковым значениям - но только в сочетании с purr: pmap, а не с purr: map2!

Так что это работает:

map2_chr(.x = input.list$x, .y = input.list$y, ~paste(.x, .y, sep = "-"))

## [1] "Prefix_A-Suffix_X" "Prefix_B-Suffix_X" "Prefix_A-Suffix_Y"
## [4] "Prefix_B-Suffix_Y"

Я догадываюсь, что эта проблема может иметьчто-то делать с NSE (нестандартная оценка), но я просто не могу понять это, потому что purr: map2 работает, как и ожидалось.

Я был бы благодарен за хорошее объяснение почему это происходит - и как заставить его работать с purr: pmap.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Здесь столбцы expand.grid можно изменить на класс character, если мы используем stringsAsFactors = FALSE, а затем с помощью pmap можно paste элементы в каждой строке

library(purrr)
input.list <- expand.grid(x=target.labels, y=features.sets, stringsAsFactors = FALSE)
pmap_chr(input.list, paste, collapse="-")
#[1] "Prefix_A Suffix_X" "Prefix_B Suffix_X" "Prefix_A Suffix_Y" "Prefix_B Suffix_Y"
0 голосов
/ 06 февраля 2019

Базовая функция expand.grid превращает ваши столбцы в факторы.Поскольку вы уже используете функции Tidyverse, используйте вместо Tidy crossing вместо

input.list <- crossing(x=target.labels, y=features.sets)

Тогда fun1 или fun1 должны работать нормально.Проблема с факторами заключается в том, что они в основном хранятся как целые числа в R, поэтому они более вероятно будут преобразованы в числа, чем в символы.

...