R自定义文本处理函数报cannot coerce type 'closure'错误如何解决?
错误原因
- 传入函数的
TidySymptoms结构不符合要求:你的函数逻辑依赖输入数据集有id(分组用)、text(待处理文本列)两个字段,但你提供的TidySymptoms前10行只有word一列,缺少两个必填字段。 - 报错的直接触发逻辑:
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
相关产品推荐
相关产品推荐

