我的文件读取功能使用附加参数构造...和可选参数不起作用
My file reading function using the additional parameters construct ... and optional parameters doesn't work
我正在编写一个函数 read_list_if
,其输入是:
- 要读取的文件列表
files_list
- 一个函数
read_func
读取每个文件
- 和可选的函数
select_func
来跳过不满足特定布尔条件的文件。
完整代码为
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
# ....
我正在编写一个函数 read_list_if
,其输入是:
- 要读取的文件列表
files_list
- 一个函数
read_func
读取每个文件 - 和可选的函数
select_func
来跳过不满足特定布尔条件的文件。
完整代码为
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
# ....