Поместите все фреймы данных с именами, содержащими определенную строку, в один список

#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"