我的文件读取功能使用附加参数构造...和可选参数不起作用

My file reading function using the additional parameters construct ... and optional parameters doesn't work

我正在编写一个函数 read_list_if,其输入是:

完整代码为

read_func <- function(...){
  read_csv(..., 
           col_types = cols(
             .default= col_integer()),
           col_names = TRUE)
}


read_list_if <- function(files_list, read_func, select_func = NULL, ...){

  if (is.null(select_func)) {

    read_and_assign <- function(dataset, read_func, ...){
      dataset_name <- as.name(dataset)
      dataset_name <- read_func(dataset, ...)
      return(dataset_name)
    }

  } else

    read_and_assign <- function(dataset, read_func, select_func, ...){
      dataset_name <- as.name(dataset)
      dataset_name <- read_func(dataset,...)
      if (select_func(dataset_name)) {
        return(dataset_name)
      } 
      else return(NULL)
    }

  # invisible is used to suppress the unneeded output
  output <- invisible(
    sapply(files_list,
           read_and_assign, read_func = read_func, 
           select_func = select_func, ..., 
           simplify = FALSE, USE.NAMES = TRUE))

}


library(readr)
files <- list.files(pattern = "*.csv")
datasets <- read_list_if(files, read_func)

将代码保存在脚本中(例如,test.R)与至少一个 .csv 文件(即使是用 touch foo.csv 创建的空文件也可以) ).如果你现在 source("test.R"),你会得到错误:

Error in read_csv(..., col_types = cols(.default = col_integer()), col_names = TRUE) : 
  unused argument (select_func = NULL)

奇怪的是,如果目录中没有没有 .csv文件,那么不会产生错误。我猜这是因为,当 sapply 的第一个参数,即 files_list 是一个空列表时,其余参数不会被评估(R 惰性评估)。

最简单的解决方法可能是 "slurp up" read_and_assign 函数中的空 select_func 参数。这将防止它通过 ... 参数传递。

# ....
if (is.null(select_func)) {

  read_and_assign <- function(dataset, read_func, select_func, ...){
    dataset_name <- as.name(dataset)
    dataset_name <- read_func(dataset, ...)
    return(dataset_name)
  }

} else
# ....