如何在R targets工具中实现多文件输出(以数据集拆分后分别存储为例)
解决targets包中多文件输出的问题
我明白你想把数据集拆分并保存为独立文件,同时希望用一个target来完成这个步骤,让_targets.R更简洁。咱们来一步步解决这个问题:
问题根源
你当前的代码报错,主要有两个原因:
- 当
tar_target使用format="file"时,虽然支持返回多个文件路径,但后续的train_model()和eval_model()函数需要的是数据框,直接传入文件路径会导致函数无法处理。 - 返回的未命名字符向量,后续无法明确区分训练集和测试集的路径,不利于后续target调用。
解决方案
我们可以修改split_dataset()函数,返回命名的文件路径列表,同时在_targets.R中正确配置target,让targets追踪这两个输出文件,再创建轻量target读取这些文件为数据框供后续使用。
步骤1:更新split_dataset()函数
修改R/functions.R中的函数,返回命名列表,明确标记训练集和测试集的文件路径:
split_dataset <- function(data) { idx <- sample.int(nrow(data), 0.8 * nrow(data)) train <- data[idx, ] test <- data[-idx, ] # 定义文件路径 train_path <- "data/train.csv" test_path <- "data/test.csv" # 保存文件(建议加上row.names=FALSE避免生成额外索引列) write.csv(train, train_path, row.names = FALSE) write.csv(test, test_path, row.names = FALSE) # 返回命名列表,方便后续精准访问 return(list(train = train_path, test = test_path)) }
步骤2:修改_targets.R配置
更新你的targets配置文件,让targets追踪拆分后的文件,再添加读取数据的target:
library(targets) source("R/functions.R") set.seed(124) list( tar_target(raw_data, "data/mtcars.csv", format = "file"), tar_target(data, read.csv(raw_data)), # 这个target会自动追踪train.csv和test.csv两个输出文件 tar_target(train_test_files, split_dataset(data), format = "file"), # 读取训练集数据,供建模使用 tar_target(train_data, read.csv(train_test_files$train)), # 读取测试集数据,供评估使用 tar_target(test_data, read.csv(train_test_files$test)), # 使用训练集建模 tar_target(model, train_model(train_data)), # 使用测试集评估模型 tar_target(eval, eval_model(model, test_data)) )
为什么这样可行?
format="file"会让targets自动追踪train_test_files返回的两个文件,只要这两个文件被修改,targets就会重新运行这个拆分步骤。- 命名列表让我们可以精准访问训练集和测试集的文件路径,后续的
train_data和test_datatarget会自动读取对应文件,传递给建模和评估函数。 - 整个拆分和保存步骤还是浓缩在一个target里,保持了
_targets.R的简洁性,符合你的需求。
额外小贴士
如果你想进一步简化,也可以让split_dataset()同时返回数据框和文件路径,但不建议这么做——targets的设计理念是每个target只负责单一职责,要么追踪文件,要么追踪数据,混合使用会增加调试复杂度。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

