Почему имена аргументов функций должны совпадать с именами списков с pmap? - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь понять, почему этот код работает:

tmp <- list(this = list(1:5), 
            that = list(10*c(1:5)), 
            other = list(100*c(1:5))) 

tmp %>% pmap(function(this, that, other) paste(this, that, other))

... но следующий код выдает ошибку "неиспользуемые аргументы":

tmp %>% pmap(function(a, b, c) paste(a, b, c))

Я сталкивался это пост на GitHub, но я до сих пор не понимаю, как это можно применить .. спасибо!

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Если у вас есть именованный список, как показано в примере, вам нужно сослаться на них с соответствующими именами в анонимной функции. Следовательно, это работает для именованного списка

library(purrr)
tmp %>% pmap(function(this, that, other) paste(this, that, other))

, а это не так.

tmp %>% pmap(function(a, b, c) paste(a, b, c))

Если вы удалите имена из списка, вы можете использовать любую переменную в аргументе.

unname(tmp) %>% pmap(function(a, b, c) paste(a, b, c))

#[[1]]
#[1] "1 10 100" "2 20 200" "3 30 300" "4 40 400" "5 50 500"
0 голосов
/ 31 марта 2020

Мы можем сделать это без какой-либо анонимной функции

library(purrr)
library(dplyr)
tmp %>%
     pmap(paste)
#[[1]]
#[1] "1 10 100" "2 20 200" "3 30 300" "4 40 400" "5 50 500"

Кроме того, при tidyverse анонимный синтаксис может быть

tmp %>%
   pmap(~ paste(..1, ..2, ..3))
#[[1]]
#[1] "1 10 100" "2 20 200" "3 30 300" "4 40 400" "5 50 500"
0 голосов
/ 31 марта 2020

Если я не правильно понял ваш вопрос, второй не работает, потому что a, b и c не являются элементами списка, которые присоединены в среде вызова pmap.

Если вы назвали элементы списка a, b и c, это сработало бы.

tmp2 <- list(a = list(1:5), 
            b = list(10*c(1:5)), 
            c = list(100*c(1:5))) 

tmp2 %>% pmap(function(a, b, c) paste(a, b, c))
#[[1]]
#[1] "1 10 100" "2 20 200" "3 30 300" "4 40 400" "5 50 500"

Возможно, у вас есть объекты с именами a, b или c в вашей глобальной среде? Я получаю другое сообщение об ошибке.

tmp %>% pmap(function(a, b, c) paste(a, b, c))
#Error in .f(this = .l[[1L]][[1L]], that = .l[[2L]][[1L]], other = .l[[3L]][[1L]],  : 
#  unused arguments (this = .l[[1]][[1]], that = .l[[2]][[1]], other = .l[[3]][[1]])

packageVersion("purrr")
#[1] ‘0.3.3’
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...