通过多个函数层使用点(“...”)参数的问题

问题描述 投票:0回答:0

我正在尝试将 R 函数的点参数用于数据导入函数。该函数应采用文件路径列表

data_list
并接受更多参数以传递给内部使用的
fread()
函数。它应该导入指定的文件并将它们绑定到一个数据框中。输出保存到全局环境中。

到目前为止的例子和想法:

我有一个文件夹“test1”,包含一个文件和一个文件夹“test2”,包含多个文件。这些文件是具有相同内部结构的 .txt 文件(在本例中为 4 行无用的标题和 4 行数据),如下所示:

this is
a header
with some text
that should be ignored when importing
1;2;3;4
2;2;4;2
3;4;3;2
4;2;3;1

我生成我的列表:

data_list_1 <- list.files(path = "./test1", 
                          recursive = TRUE, 
                          pattern = "*.txt", 
                          full.names = TRUE)

data_list_2 <- list.files(path = "./test2", 
                          recursive = TRUE, 
                          pattern = "*.txt", 
                          full.names = TRUE)

在单个文件的情况下,将参数传递给

fread()
有效:

data_import_test_1 <- function(data_list, ...) {
  .GlobalEnv$test_import <- fread(file = data_list, ...)
}

# imagine i have a fileset where i need to skip the first 4 rows when
# importing (data_list_1 contains a single file path)

data_import_test_1(data_list = data_list_1, skip = 4)

# output created is a dataframe of the specified file 
# without the first 4 rows

但是现在我想用

fread()
一次导入多个文件并用
rbind()
将它们附加在一起所以我想把它包在
lapply()
里面像这样:

data_import_test_2 <- function(data_list, ...) {
  .GlobalEnv$test_import <- do.call(what = rbind,
                                    args = lapply(data_list,
                                                  function(x, ...) fread(x, ...))
}

# imagine i have multiple files of the same format as the single file 
# from the import above and data_list_2 contains all of them

data_import_test_2(data_list = data_list_2, skip = 4)

# output created still contains the rows i wanted to skip, 
# the skip = 4 argument doesnt reach fread()

有没有人知道如何处理切换而不必将其硬编码到函数参数中?我将对来自不同来源的分段数据集使用我的函数,这些数据集需要对 fread 进行不同的输入。这意味着我真的很想让我的功能动态地移交我需要输入 fread 的任何东西。

非常感谢大家看到这里,提前谢谢你们!

我知道我可以像这样将参数硬编码到我的函数中:

data_import_test_2 <- function(data_list, fread_skip) {
  .GlobalEnv$test_import <- do.call(what = rbind,
                                    args = lapply(data_list,
                                                  function(x, fread_skip = fread_skip) 
                                                      fread(x, skip = fread_skip))
}

我想对不同的数据集使用

fread
的其他参数,我不想将它们全部包含在我的函数参数中,因为这会造成很多混乱并降低可读性。

r function import arguments parameter-passing
© www.soinside.com 2019 - 2024. All rights reserved.