purrr: перебор именованного списка с картой (с фабрикой функций) - PullRequest
0 голосов
/ 04 октября 2018

Я хочу перебрать именованный список (с картой), но каким-то образом то, что работает в одном списке, не работает в масштабе.В чем здесь проблема, и что мне нужно изменить, чтобы она работала?

Я подозреваю, что у нее есть что-то.делать с разницей между list[1] и list[[1]], но я скучаю по нему.

library(rlang)
library(tidyverse)

# this works
single_list <- list(one = 1)

create_function <- function(mylist){
  function(){
    x <- names(mylist)
    n <- purrr::flatten_chr(mylist)

    rep(x, n)
  }
}

one <- create_function(single_list)
one()
#> [1] "one"


# this doesn't work
long_list <- list(one = 1,
                  two = 2,
                  three = 3)

fun <- long_list %>% 
  map(create_function)

fun$one()
#> Error: `.x` must be a list (double)

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

При выполнении итерации map автоматически подставляется содержимое каждого элемента, поэтому вы вызываете flatten_chr для числового вектора, который выдает ошибку.Удаление вызова flatten_chr на самом деле ничего не исправит, потому что имена не передаются map, поэтому вы просто получите NULL при вызове функций.

Хороший подход заключается визмените фабричную функцию, чтобы она принимала два параметра, чтобы вы могли перебирать как содержимое, так и имена.purrr::imap выполняет эту итерацию автоматически, поэтому вы можете написать

library(purrr)

create_function <- function(n, x){
    function(){
        rep(x, n)
    }
}

list(one = 1,two = 2,three = 3) %>% 
    imap(create_function) %>% 
    map(invoke)    # call each function in list
#> $one
#> [1] "one"
#> 
#> $two
#> [1] "two" "two"
#> 
#> $three
#> [1] "three" "three" "three"
0 голосов
/ 04 октября 2018

Для создания функции требуется list вход

map(seq_along(long_list), ~ create_function(long_list[.x])())
#[[1]]
#[1] "one"

#[[2]]
#[1] "two" "two"

#[[3]]
#[1] "three" "three" "three"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...