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

R自定义文本处理函数报cannot coerce type 'closure'错误如何解决?

错误原因
  1. 传入函数的TidySymptoms结构不符合要求:你的函数逻辑依赖输入数据集有id(分组用)、text(待处理文本列)两个字段,但你提供的TidySymptoms前10行只有word一列,缺少两个必填字段。
  2. 报错的直接触发逻辑:mutate中执行gsub(x = text, ...)时,R在输入数据框中找不到text列,就会向上层环境搜索同名变量,最终命中base包的text()绘图函数,该函数属于闭包(closure)类型,无法被gsub转为字符向量处理,因此抛出类型转换错误。
解决方案

步骤1:确认输入数据格式

你需要将未分词的原始文本数据集传入函数,而不是已经经过unnest_tokens拆分、仅保留word列的处理后数据。如果你的原始数据已经丢失,只有当前的TidySymptoms,需要先补充分组id字段,再将同id的word拼接为完整text字段。

步骤2:优化函数并调用

首先优化函数冗余参数,增加字段校验避免后续同类报错:

library(dplyr)
library(tidytext)
data(stop_words)

# 优化后处理函数
minus_TextNum <- function(df){
  # 校验必填字段是否存在,缺失直接抛出明确提示
  stopifnot("输入数据需包含id、text两列" = all(c("id", "text") %in% colnames(df)))
  res <- mutate(df, text = gsub(x = text, pattern = "[0-9]+|\\(.*\\)", replacement = "")) %>%  
    unnest_tokens(input = text, output = word) %>% 
    filter(!word %in% c(stop_words$word, "patient")) %>% 
    group_by(id) %>% 
    summarise(text = paste(word, collapse = " "))
  return(res)
}

如果是使用未分词的原始数据集(示例名raw_symptoms,含id、text两列),直接调用即可:

result <- minus_TextNum(raw_symptoms)

如果只有当前的TidySymptoms,先预处理为符合要求的格式再调用:

# 请根据实际业务逻辑调整分组id的生成规则,此处仅为示例
TidySymptoms <- TidySymptoms %>% 
  mutate(id = c(rep(1, 5), rep(2, 5))) 

# 聚合为id+text格式
process_input <- TidySymptoms %>% 
  group_by(id) %>% 
  summarise(text = paste(word, collapse = " "))

# 调用函数
result <- minus_TextNum(process_input)

内容的提问来源于stack exchange,提问作者Magnetar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:36:02