У меня уже есть список, содержащий все функции в dplyr с использованием этого кода

content <- mget(ls("package:dplyr"), inherits = TRUE)
dplyr_functions <- Filter(is.function, content)

Результат, который я хочу получить, похож на результат

names(dplyr_functions)

Это будет вектор chr, содержащий все имена функций в пакете dplyr. Но когда я использую функцию map(), мой код выглядит так:

dplyr_name <- map_chr(dplyr_functions, names)

Произошла ошибка:

«Результат 1 должен быть одной строкой, а не NULL длины 0»

Итак, я просто хочу знать, что означает ошибка? Как я могу использовать map_chr, чтобы получить вектор, содержащий все имена в dplyr_functions ?

1
a111ex 11 Окт 2019 в 17:45

1 ответ

Лучший ответ

map перебирает "значение" содержимого элемента списка, например dplyr_functions[[1]] и так далее, а не через элемент, как в dplyr_functions[1], попробуйте оба, чтобы увидеть разницу. Следовательно, names(dplyr_functions[[1]]) возвращает NULL и map_chr терпит неудачу, а names(dplyr_functions[1]) возвращает %>% и map_chr может работать.

Таким образом, мы можем перебрать индекс и подмножество списка с помощью второго метода или использовать imap, который предназначен для перебора имен списков.

library(purrr)
map_chr(seq_along(dplyr_functions), ~names(dplyr_functions[.x])) 
#or
imap_chr(dplyr_functions, ~.y) %>% unname()
2
A. Suliman 11 Окт 2019 в 15:19