#r #list #function
#r #Список #функция
Вопрос:
Я пытаюсь написать функцию, которая создает список фреймов данных, содержащих определенную строку.
Если я напишу:
objlist <- ls(pattern = "*_results*")
all_dfs <- ls()[sapply(ls(), function(x) any(class(get(x)) == 'data.frame'))]
dfs_list <- mget(Reduce(intersect, list(objlist, all_dfs)))
«dfs_list» содержит все фреймы данных в среде, которые содержат «_results» (в моем конкретном случае он создает список из 20 фреймов данных).
Однако, если я попытаюсь преобразовать его в функцию:
list_dataframes <- function(pattern) {
objlist <- ls(pattern = pattern)
all_dfs <- ls()[sapply(ls(), function(x) any(class(get(x)) == 'data.frame'))]
dfs_list <- mget(Reduce(intersect, list(objlist, all_dfs)))
return(dfs_list)
}
flarp <- list_dataframes("*_results*")
Объект «flarp» представляет собой список из 0 элементов.
Что я здесь делаю не так?
Ответ №1:
Это связано с тем, что функция создает другую «функциональную среду», и поскольку вы вызываете ls()
из этой функции, у вас будет список объектов, существующих в этой функции. Пожалуйста, рассмотрите следующий код, который должен быть понятным.
print(ls()) # Globalenv objects
test <- function() { #different envir inside a function
a <- "test"
print(ls())
}
test() # only prints "a"
test <- function() {
print(ls(.GlobalEnv))
}
test() # prints all the globalenv objects
На самом деле функции используют до четырех типов сред: окружение, привязка, выполнение и вызов. Вы можете узнать больше в этой подробной главе книги Хэдли «Advanced R«.
Комментарии:
1. Спасибо, я добавил аргумент для среды, которая используется по умолчанию. GlobalEnv и поместите его в качестве аргумента для вызовов ls() и mget(). Похоже, теперь он работает!
Ответ №2:
Это из -за ls()
. Когда вы помещаете его в функцию, вам нужно явно указать среду, либо с помощью name
pos
env
аргументов , либо, т.е.
f1 <- function() ls()
f1()
#character(0)
f1 <- function() ls(pos = 1)
f1()
#[1] "df" "f1" "rb"