【问题标题】:Error: could not find function "%>%"错误:找不到函数“%>%”
【发布时间】:2015-07-26 17:36:21
【问题描述】:

我正在 R 中运行一个示例,通过这些步骤,到目前为止一切正常,除了此代码会产生错误:

 words <- dtm %>%
 as.matrix %>%
 colnames %>%
 (function(x) x[nchar(x) < 20])

错误:找不到函数“%>%”

我不明白使用这个特殊运算符有什么好处 %&gt;% 是,任何反馈都会很棒。

【问题讨论】:

标签: r dplyr magrittr


【解决方案1】:

需要安装magrittr如下

install.packages("magrittr")

然后,在一个脚本中,不要忘记在顶部添加

library(magrittr)

对于运算符%&gt;%的含义,你可能要考虑this questionWhat does %>% function mean in R?

请注意,相同的运算符也适用于库 dplyr,因为它从 magrittr 导入。

dplyr 曾经有一个类似的运算符 (%.%),现在已弃用。 Here 我们可以了解%.%(库中已弃用的运算符dplyr)和%&gt;%(来自magrittr 的运算符,也可在dplyr 中找到)之间的区别

【讨论】:

    【解决方案2】:

    好处是使用了前一个函数的输出。例如,您无需重复数据源的来源。

    【讨论】:

    • 请将此作为评论。谢谢。
    【解决方案3】:

    可以使用以下内容:

     install.packages("data.table")
     library(data.table)
    

    【讨论】:

    • 错误答案恕我直言 - 这确实没有定义函数“%>%”。加上这两行,我还是一样:could not find function "%&gt;%"
    • 管道运算符不属于data.table 包...
    【解决方案4】:

    您需要先加载定义函数的包(如magrittrdplyr),然后它才能工作。

    install.packages("magrittr") # package installations are only needed the first time you use it
    install.packages("dplyr")    # alternative installation of the %>%
    library(magrittr) # needs to be run every time you start R and want to use %>%
    library(dplyr)    # alternatively, this also loads %>%
    

    引入管道运算符%&gt;% 是为了“减少开发时间并提高代码的可读性和可维护性。”

    但是每个人都必须自己决定它是否真的适合他的工作流程并使事情变得更容易。 有关magrittr的更多信息,请单击here

    不使用管道%&gt;%,此代码将返回与您的代码相同的代码:

    words <- colnames(as.matrix(dtm))
    words <- words[nchar(words) < 20]
    words
    

    编辑: (由于@Molx 发表了非常有用的评论,我正在扩展我的答案)

    尽管来自magrittr,但管道运算符更常用 使用包dplyr(需要并加载magrittr),所以 每当您看到有人使用 %&gt;% 时,请确保您不应该加载 dplyr 而是。

    【讨论】:

    • 你的意思是上面写的代码可以用不同的方式编写,而不需要使用 %>%
    • 尽管来自magrittr,管道运算符更常用于包dplyr(它需要并加载magrittr),所以每当你看到有人使用%&gt;%时,请确保你不应加载 dplyr
    • 我想强调,仅加载 Tidyverse (library(tidyverse)) 可能还不够。我在library(tidyverse)之后添加了(library(dplyr)),然后找到了%&gt;%
    【解决方案5】:

    在 Windows 上:如果在 %dopar% 循环中使用 %>%,则必须添加对加载包 dplyr(或 magrittrdplyr 加载)的引用。

    例子:

    plots <- foreach(myInput=iterators::iter(plotCount), .packages=c("RODBC", "dplyr")) %dopar%
    {
        return(getPlot(myInput))
    }
    

    如果您省略了.packages 命令,而是使用%do% 使其全部在一个进程中运行,则可以正常工作。原因是它都在一个进程中运行,因此不需要专门加载新的包。

    【讨论】:

    • 这是一个很好的观点,值得特别强调与 foreach 相关的内容。我过去遇到过这个问题,这与接受的答案解决的问题不同。
    • 我不确定这是否也是强调这一点的正确场所,但我已经建议并根据简化 foreach 循环的迭代器包进行编辑。如果这不合适,请随意忽略。
    • 谢谢。救了我。我不知道我需要在 foreach 中声明依赖项。
    猜你喜欢
    • 2018-07-31
    • 2016-05-20
    • 2015-09-06
    • 2017-12-07
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多