-
返回原始数据。 这种精神在大多数 tidyverse 动词函数和许多其他包(以及一些在 base R 中)中得到传达。如果您使用%>% 或|> 管道,这样做可以在您的函数之后处理数据,这可能非常方便。
write_to_disk <- function(data, folder, name){
vroom::vroom_write(
data,
file.path(folder, paste0(name, ".tsv"))
)
data
}
(您的函数已经隐式执行此操作,因为对 vroom::vroom_write 的调用是函数体中的最后一个表达式。)
-
返回文件写入调用的输出。坦率地说,我不太喜欢这个,因为如果你改变了你的包装器正在使用哪个函数,那么返回值您的功能很可能会发生变化。我不知道你的包装函数的生命周期预期,但想象一下如果你选择从vroom::vroom 切换到另一个函数; vroom 返回基于 col_select 的数据子集,可能较新的函数会返回整个数据,这可能会破坏下游处理的假设。
write_to_disk <- function(data, folder, name){
out <- vroom::vroom_write(
data,
file.path(folder, paste0(name, ".tsv"))
)
out
}
注意:我明确选择捕获到out 并返回它,以防您在vroom::vroom_write 和后续out 之间添加代码。您未更改的原始功能实际上是在执行相同的操作,但如果您选择在vroom_write 之后执行任何操作,则需要执行此额外步骤。
否则,您的函数已经隐式执行此操作,因为 vroom::vroom_write 返回数据。
-
返回文件名。这仅在文件名不一定事先知道的情况下才有用。例如,如果您的包装器注意不覆盖同名文件,它可能会添加一个计数器(预扩展),以便永远不会发生覆盖。在这种情况下,调用环境不知道选择的文件名是什么,因此它具有价值(有时)。
write_to_disk <- function(data, folder, name){
# file numbering
re <- paste0("^", name, "_?([0-9]+)?\\.tsv$")
existfiles <- list.files(folder, pattern = re, full.names = TRUE)
nextnum <- max(0L, suppressWarnings(as.integer(gsub(re, "\\1", basename(existfiles)))), na.rm = TRUE)
if (nextnum > 0) {
name <- sprintf("%s_%03i", name, nextnum + 1L)
}
filename <- file.path(folder, paste0(name, ".tsv"))
vroom::vroom_write(
data,
filename
)
filename
}
(提供的“文件编号”代码仅作为我认为返回文件名可能有意义的示例。)
-
返回写入函数的成功。这可能需要使用try 或tryCatch(或任何tidyverse 等效项),捕获错误,以及做出相应的反应。
write_to_disk <- function(data, folder, name){
res <- tryCatch(
vroom::vroom_write(
data,
file.path(folder, paste0(name, ".tsv"))
),
error = function(e) e
)
out <- !inherits(res, "error")
if (!out) {
attr(out, "error") <- conditionMessage(res)
}
out
}
-
返回nothing。这当然是最简单的。您需要明确地执行此操作,以免无意中从文件写入函数返回返回值。
write_to_disk <- function(data, folder, name){
vroom::vroom_write(
data,
file.path(folder, paste0(name, ".tsv"))
)
NULL
}