在自定义函数中将多个 RDS 文件作为多个对象加载到 R 中

Loading Multiple RDS Files in R as Multiple Objects in a Custom Function

我正在尝试编写一个自定义函数来加载多个 RDS 文件并将它们分配给我环境中的单独对象。该函数的代码如下:

read_multi_rds <- function(filepath, regrex) {

  ## grab all files in filepath with regrex provided
  files <- list.files(path = filepath, pattern = regrex) 
  var_names <- character(0)

  for(i in 1:length(files)){
    name <- substr(files[i], 1, (nchar(files[i])-4)) ## -4 to remove the .rds from the var name
    var_names[i] <- name
  }

  for(i in 1:length(files)){
    file <- readRDS(paste0(filepath, files[i]))
    assign(var_names[i], file)
  }
}

当我通过运行函数的每一位分别测试这个函数时:

filepath <- "I:/Data Sets/"
regrex <- "^cleaned"

files <- list.files(path = filepath, pattern = regrex) 
var_names <- character(0)

...接着是...

for(i in 1:length(files)){
    name <- substr(files[i], 1, (nchar(files[i])-4)) ## -4 to remove the .rds from the var name
    var_names[i] <- name
  }

...最后...

for(i in 1:length(files)){
    file <- readRDS(paste0(filepath, files[i]))
    assign(var_names[i], file)
  }

...对象已加载到环境中。

但是当我尝试使用函数加载对象时:

read_multi_rds(filepath = "I:/Data Sets/", regrex = "^cleaned")

没有加载任何内容。我添加了以下行:

print('done')

在函数的末尾,以确保它是完整的 运行,而且看起来是。我也没有收到任何错误消息或警告。

是否需要在函数中添加一些内容才能将这些项目正确加载到我的环境中?或者这是不可能在 R 中作为一个函数来做的?我很高兴只使用我的脚本中的代码,但如果我能把它作为一个函数来使用它会更整洁。

assign,在函数中使用时,在函数的环境中赋值。您必须告诉 assign 在全局环境中进行分配,如下代码所示:

data(mtcars)
tmp <- tempfile(fileext = ".csv")
write.csv(mtcars, tmp)

read_wrong <- function(file_name = tmp) {
   f <- read.csv(file_name)
   assign("my_data", f)
   ls() # shows that my_data is in the current environment
}

read_correct <- function(file_name = tmp) {
   f <- read.csv(file_name)
   assign("my_data", f, envir = .GlobalEnv)
   ls() # shows that my_data is not in the current environment
}


read_wrong()
# [1] "f"         "file_name" "my_data"
ls() # no my_data
# [1] "mtcars"       "read_correct" "read_wrong"   "tmp"
read_correct()
# [1] "f"         "file_name"
ls()
# [1] "mtcars"       "my_data"      "read_correct" "read_wrong"   "tmp" 

话虽如此,我首先不会使用 assign,而是 return 来自函数的数据帧列表。

read_better <- function(file_name = tmp) {
   parsed_name <- basename(tmp) # do some parsing here to get a proper object name
   f <- read.csv(file_name)
   setNames(list(f), parsed_name)
}
all_data <- read_better()