You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:22:14