#r #function #output
Вопрос:
Я хочу написать функцию, которая возвращает список всех (внутренне сгенерированных) объектов. Я попытался использовать ls() %gt;% mget()
или get
, но я получаю ошибку Error: value for ‘xxx’ not found
. Я почти уверен, что проблемы связаны с аргументами pos
/ environment
, но я не могу найти решение. Вот мой код:
library(magrittr) types lt;- c("Mouse", "Cage", "Mating") %gt;% magrittr::set_names(., .) tmp1 lt;- types %gt;% lapply(function(type) list(type = type)) %gt;% lapply(function(lst) { type lt;- lst$type regex lt;- paste0("prefix_", type, "_suffix") ls() %gt;% mget() }) tmp2 lt;- types %gt;% lapply(function(type) list(type = type)) %gt;% lapply(function(lst) { type lt;- lst$type regex lt;- paste0("prefix_", type, "_suffix") ls() %gt;% lapply(get) }) tmp3 lt;- types %gt;% lapply(function(type) list(type = type)) %gt;% lapply(function(lst) { type lt;- lst$type regex lt;- paste0("prefix_", type, "_suffix") list( type = type, regex = regex ) })
tmp3
дает желаемый результат. Однако я не хочу, чтобы мне приходилось редактировать list(...)
раздел каждый раз, когда я изменяю функцию для создания дополнительных промежуточных объектов. Спасибо.
Комментарии:
1. Что-то в форме
mget(grep("type",ls(),value = TRUE))
вернет список объектов, соответствующих шаблону регулярного выражения, это то, к чему вы стремитесь?2. Возможно, попробуем
types %gt;% lapply(function(type) { regex lt;- paste0("prefix_", type, "_suffix"); mget(ls()) })
3. измените
ls()%gt;%mget()
наmget(ls())
Я не могу сказать, почему первое не работает4. @Josh — похоже, так оно и есть. Использование
ls() %gt;% mget(inherits = TRUE)
илиls() %gt;% mget(envir = parent.frame())
и то, и другое работает.5. Если вы хотите проложить трубу, базовая труба работает нормально
ls() |gt; mget()
(потому что это просто синтаксический сахар, не нужно возиться со средой).