不明白不能强制类型“关闭”错误
Posted
技术标签:
【中文标题】不明白不能强制类型“关闭”错误【英文标题】:Don't understand Cannot Coerce type 'closure' Error 【发布时间】:2021-10-25 15:10:35 【问题描述】:我看到这是一个常见问题,但我无法通过阅读其他帖子或尝试理解对我来说是新的函数式编程来理解该怎么做。函数是 R 中的闭包,封装了它们创建的环境?我的代码是:
# Remove numbers from text
minus_TextNum <- function(df, new.df)
new.df <- mutate(df, text = gsub(x = text, pattern = "[0-9]+|\\(.*\\)", replacement = "")) %>% # and/or whatever's in brackets
unnest_tokens(input = text, output = word) %>%
filter(!word %in% c(stop_words$word, "patient")) %>%
group_by(id) %>%
summarise(text = paste(word, collapse = " "))
return(new.df)
minus_TextNum(TidySymptoms)
错误如下:
错误:
mutate()
列text
有问题。 ℹtext = gsub(x = text, pattern = "[0-9]+|\\(.*\\)", replacement = "")
。 x 不能强制 将“闭包”键入“字符”类型的向量
我不明白什么是闭包类型,这是一个简单的函数,适用于我为测试而创建的简单数据集。当我使用真实世界的数据集时会出现问题。
感谢任何反馈。可重现的样本如下:
# Remove numbers and/or anything in brackets
# Test Data
mydata <- data.frame(id = 1:8,
text = c("112773 Nissan Micra, Car, (10 pcs)",
"112774 Nissan Micra, Car, (10 pcs)",
"112775 Nissan Micra, Car, (10 pcs)",
"112776 Volkswagon Beetle, Car, (3 pcs)",
"112777 Toyota Corolla, Car, (12 pcs)",
"112778 Nissan Micra, Car, (10 pcs)",
"112779 Toyota Prius, Car, (9 pcs)",
"112780 Toyota Corolla, Car, (12 pcs)"),
stringsAsFactors = F)
library(dplyr)
library(tidytext)
# remove numbers from text data
data(stop_words)
minus_TextNum <- function(df, new.df)
new.df <- mutate(df, text = gsub(x = text, pattern = "[0-9]+|\\(.*\\)", replacement = "")) %>% # and/or whatevers in brackets
unnest_tokens(input = text, output = word) %>%
filter(!word %in% c(stop_words$word, "car")) %>%
group_by(id) %>%
summarise(text = paste(word, collapse = " "))
return(new.df)
minus_TextNum(mydata)
dput(head(TidySymptoms, n = 10)) 结构(列表(字= c(“会厌”,“膨胀”,“阻碍”,“吞咽”, “图片”、“苯那君”、“泰诺”、“大约”、“30”、“分钟” )), row.names = c(NA, 10L), class= "data.frame")
【问题讨论】:
minus_TextNum
接受两个参数,但您只传递一个?如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example。
您没有定义变量text
。因此,R 假设它是函数text()
,用于将文本添加到绘图中。并且一个函数不能被解释为字符。所以,gsub()
在其中找不到模式。如果text
是您的df
中的一列,则正确的表示法是df$text = gsub(x=df$text, pattern....
。
欢迎来到 ***。您的function((
中可能不需要new.df
,因为new.df <- minus_TextNum(df)
为您实现了这一点。 dput(head(you_data, n = 10)) 在这里很有用。
@MartinWettstein 好吧,是的,也不是。我认为您已经正确识别了问题,但是在dplyr::mutate
中,您建议的df$
是不需要的,如果有group_by
,则会产生错误。应在 dplyr
函数中使用不带引号的列名,不带任何 df$
前缀。
在mutate()
中,可能不需要,不。但在gsub()
是。这就是引发错误的原因。
【参考方案1】:
TidySymptoms
数据中没有 id
列。假设这是一个错误,并且您的数据中已经存在该错误,您可以在函数中进行以下更改。
df.new
传递给函数。
TidySymptoms
中的列称为word
,但您在函数中使用了text
。
试试这个代码。
minus_TextNum <- function(df)
df.new <- mutate(df, text = gsub(x = word, 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(new.df)
minus_TextNum(TidySymptoms)
【讨论】:
以上是关于不明白不能强制类型“关闭”错误的主要内容,如果未能解决你的问题,请参考以下文章