R脚本正常运行但targets工作流执行报错求助
问题与解决
问题场景
使用targets包构建分析工作流时,执行targets::tar_make()触发报错,核心错误为:
Last error: no applicable method for 'filter' applied to an object of class "character"
相关代码文件如下:
_targets.R
# Load packages required to define the pipeline: library(targets) # Set target options: tar_option_set( packages = c("tibble", "tidyverse") ) # Run the R scripts in the R/ folder with your custom functions: tar_source("R/functions2.R") # Replace the target list below with your own: list( tar_target( name = raw_traits, command = "data/PFTC4_Svalbard_2018_Gradient_Traits.csv", format = "file" ), tar_target( name = traits, command = clean_data(raw_traits) ), tar_target( name = mod_area, command = fit_model(data = traits, response = "Value", predictor = "Gradient") ), tar_target( name = fig_area, command = make_figure(traits) ) )
functions2.R
# clean data clean_data <- function(raw_traits){ traits <- raw_traits |> filter(!is.na(Value)) |> # order factor and rename variable gradient mutate(Gradient = case_match(Gradient, "C" ~ "Control", "B" ~ "Nutrients"), Gradient = factor(Gradient, levels = c("Control", "Nutrients"))) |> filter(Taxon == "alopecurus magellanicus", Trait == "Leaf_Area_cm2") } # run a linear regression fit_model <- function(data, response, predictor){ mod <- lm(as.formula(paste(response, "~", predictor)), data = data) mod } # make figure make_figure <- function(traits){ ggplot(traits, aes(x = Gradient, y = Value)) + geom_boxplot(fill = c("grey80", "darkgreen")) + labs(x = "", y = expression(Leaf~area~cm^2)) + theme_bw() }
原因分析
raw_traits目标仅返回了文件路径的字符串(即使设置了format = "file",也只是标记该字符串为文件路径,不会自动读取文件)。当clean_data函数接收这个字符串后,尝试调用filter函数处理字符对象,而filter仅适用于数据框类对象,因此触发错误。
解决办法
方案1:在raw_traits目标中直接读取文件
修改raw_traits的command参数,添加文件读取逻辑:
tar_target( name = raw_traits, command = read_csv("data/PFTC4_Svalbard_2018_Gradient_Traits.csv"), format = "file" # 保留该参数可让targets追踪文件修改,自动触发重跑 )
此方案更符合targets的工作流设计,能自动监控数据文件的变化,当文件更新时自动重新运行依赖该目标的后续步骤。
方案2:在clean_data函数内读取文件
如果希望raw_traits仅存储文件路径,可在数据清洗函数中先读取文件:
clean_data <- function(raw_traits){ traits <- read_csv(raw_traits) |> filter(!is.na(Value)) |> mutate(Gradient = case_match(Gradient, "C" ~ "Control", "B" ~ "Nutrients"), Gradient = factor(Gradient, levels = c("Control", "Nutrients"))) |> filter(Taxon == "alopecurus magellanicus", Trait == "Leaf_Area_cm2") }
内容的提问来源于stack exchange,提问作者Mikel Moriana Armendariz
相关产品推荐
相关产品推荐

