【问题标题】:Error: could not find function ... in R错误:在 R 中找不到函数...
【发布时间】:2020-03-15 06:20:31
【问题描述】:

这是一个常见问题解答问题,因此请尽可能完整。答案是社区答案,如果您认为缺少某些内容,请随时进行编辑。

This question was discussed and approved on meta.

我正在使用 R 并尝试过 some.function 但我收到以下错误消息:

Error: could not find function "some.function"

这个问题经常出现。当你在 R 中遇到这种类型的错误时,你该如何解决呢?

【问题讨论】:

  • 在你投票结束这个问题之前,首先阅读这个关于meta的讨论:meta.stackexchange.com/questions/101892/…
  • 如果一切都失败了,尝试 grepping base R 的源代码和你安装的包
  • @nullglob 这似乎有些极端 :-)
  • 我有一个相关问题:stackoverflow.com/questions/23357551/…。在这种情况下,任何R 命令都会失败,但q()!建议将不胜感激!
  • 可能有点傻,但注意不要将函数的输出命名为函数本身。 [从经验中学习...]

标签: r function error-handling r-faq


【解决方案1】:

您应该检查几件事:

  1. 您的函数名称写对了吗?名称区分大小写。
  2. 您是否安装了包含该功能的软件包? install.packages("thePackage")(只需执行一次)
  3. 您是否将该包附加到工作区? require(thePackage)(并检查其返回值)或library(thePackage)(每次启动新的 R 会话时都应该这样做)
  4. 您是否在使用尚不存在此功能的旧 R 版本?
  5. 您是否使用不同版本的特定?这可能是两个方向:随着时间的推移添加和删除函数,并且您引用的代码可能需要比您已安装的包的更新或旧版本。

如果您不确定该函数位于哪个包中,您可以做一些事情。

  1. 如果您确定安装并附加/加载了正确的包,请输入 help.search("some.function")??some.function 以获取一个信息框,该框可以告诉您它包含在哪个包中。
  2. findgetAnywhere 也可用于定位函数。
  3. 如果您对包一无所知,可以按照this answer 中的说明在sos 包中使用findFn
  4. RSiteSearch("some.function") 或搜索 rdocumentationrseek 是查找函数的替代方法。

有时您需要使用旧版本的 R,但运行为新版本创建的代码。新添加的函数(例如 R 3.4.0 中的 hasName)将不会被找到。如果您使用较旧的 R 版本并希望使用较新的功能,您可以使用包 backports 使此类功能可用。您还可以在 git repo of backports 上找到需要反向移植的函数列表。请记住,早于 R3.0.0 的 R 版本与为 R3.0.0 及更高版本构建的软件包不兼容。

【讨论】:

  • 嗨,Joris,我有一个简单的问题。我是 R 的新手,但我能够成功安装它。我想从命令行使用“celestial”包中的“cosvol”函数。与从 Fedora 存储库安装到我的 Linux 系统中的 R 不同,我已将我的“天体”包下载到“家”的不同目录中。每次我请求函数“cosvol()”时,它都会显示“找不到函数“cosdistCoVol”。”我不确定如何让 R 知道我的导演,其中所有功能都分别下载到我的“天体”包中。感谢您的帮助。
  • 如果该函数位于核心/基础 R 库之一中,您可能需要对其进行更新。就我而言,我试图在utils 中使用hasName 函数。但是,我使用的是 3.3.1,而 hasName 直到 3.4.0 才引入。由于您无法将 utils 更新为独立库,因此 R/R Studio 说我没有要更新的库。
  • @mpag 这是因为 utils 包是 R 版本的组成部分。如果您按字面意思使用 RSiteSearch("hasName") ,则第一个条目是对 backports 包的引用,它将使该功能在 R 3.3.1 中可用。另请参阅github.com/r-lib/backports 了解更多信息。我已经为那个案例添加了一些信息,谢谢通知
  • @JorisMeys 这很有帮助。我还想提出,在该函数的帮助页面(例如?hasName)上记录一个函数何时添加到 R 应该是标准做法。例如。 https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNamehttps://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.html 都没有说“在 R 3.4.0 中引入”,我最终通过浏览 github 存储库并查看了 blame 的 utils/R/hasName.R 和 base/R/match 来弄清楚。 R
  • @mpag 或者您可以打开RSiteSearch("hasName") 中的第一个点击并获得相同的信息。这就是为什么我在几年前添加了这个答案。这是一个有用的技巧;-)
【解决方案2】:

存在 NAMESPACE 的另一个问题是,您正在尝试从包 foo 运行未导出的函数。

例如(做作,我知道,但是):

> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"

首先,您不应该直接调用 S3 方法,而是假设 plot.prcomp 实际上是包 foo 中的一些有用的内部函数。如果你知道自己在做什么,要调用这样的函数需要使用:::。您还需要知道函数所在的命名空间。使用getAnywhere()我们发现该函数在包stats中:

> getAnywhere(plot.prcomp)
A single object matching ‘plot.prcomp’ was found
It was found in the following places
  registered S3 method for plot from namespace stats
  namespace:stats
with value

function (x, main = deparse(substitute(x)), ...) 
screeplot.default(x, main = main, ...)
<environment: namespace:stats>

所以我们现在可以直接调用它:

> stats:::plot.prcomp(mod)

我以plot.prcomp 为例来说明目的。在正常使用中,您不应该像这样调用 S3 方法。但是正如我所说,如果您要调用的函数存在(例如,它可能是一个隐藏的实用函数),但在 namespace 中,R 将报告它找不到该函数,除非您告诉它哪个命名空间进去看看。

将此与以下内容进行比较: stats::plot.prcomp 上面的失败是因为stats 使用plot.prcomp,它不是从stats 导出的,因为错误正确地告诉我们:

错误:“plot.prcomp”不是从“namespace:stats”导出的对象

记录如下:

pkg::name 返回命名空间 pkg 中导出的变量名的值,而 pkg:::name 返回内部变量名的值。

【讨论】:

  • 谢谢 - 这在为 could not find function "anova.lm"... 升级到 R 3 后拯救了我...修复了调用 stats:::anova.lm() 代替
  • 虽然不那么相关,但::: 的使用被认为是设计错误,而:: 是首选。无法轻易找到参考。
  • @NelsonGon 恕我直言,:::::不同的,您的编辑不会工作plot.prcomp() 函数 不是 从 stats 命名空间导出的,因此您需要使用 :::
  • @GavinSimpson 对!对于设计错误,我接受了一位受人尊敬的 R 开发人员的话,但从未真正验证过它。也许,这是他们的个人意见。
【解决方案3】:

当计算机在我的控制之下时,我通常可以解决这个问题,但在使用网格时它更令人讨厌。当网格不是同质的时,并不是所有的库都可以安装,我的经验经常是因为没有安装依赖项而没有安装包。为了解决这个问题,我检查了以下内容:

  1. 是否安装了 Fortran? (查找“gfortran”。)这会影响 R 中的几个主要包。
  2. 是否安装了 Java? Java 类路径是否正确?
  3. 检查软件包是否由管理员安装并且可供相应用户使用。有时用户会将软件包安装在错误的位置,或者在没有适当访问正确库的情况下运行。 .libPaths() 是一个很好的检查。
  4. 检查 R 的 ldd 结果,以确保共享库
  5. 最好定期运行一个脚本来加载所需的每个包并进行一些小测试。这会在工作流程中尽早发现包问题。这类似于构建测试或单元测试,只不过它更像是一个冒烟测试,以确保非常基本的东西能够正常工作。
  6. 如果包可以存储在网络可访问的位置,是吗?如果他们不能,有没有办法确保跨机器的版本一致? (这可能看起来 OT,但正确的软件包安装包括正确版本的可用性。)
  7. 该软件包是否可用于给定的操作系统?不幸的是,并非所有软件包都可以跨平台使用。这又回到第 5 步。如果可能,请尝试通过切换到适当风格的包或在某些情况下关闭依赖项来找到处理不同操作系统的方法。

经常遇到这种情况,其中一些步骤变得相当常规。虽然 #7 似乎是一个很好的起点,但这些都是按照我使用它们的频率的大致顺序列出的。

【讨论】:

  • 可以肯定的是有用的考虑因素,但更多的是“为什么我在安装软件包时收到错误”的答案。
  • @DWin:也许,但不是真的。我可能一直不清楚。当一项工作因未安装软件包而在网格上停止时,就会出现这些问题。在网格上保持软件一致性并不难,但确实需要一个良好的安装、维护和调试过程。这些只是每个阶段出现的一些项目,至少因为它们与功能不可用时发出的尖叫声有关。 :)
【解决方案4】:

如果在您检查包裹(R CMD 检查)时发生这种情况,请查看您的 NAMESPACE。

您可以通过将以下语句添加到 NAMESPACE 来解决此问题:

exportPattern("^[^\\\\.]")

这会导出不以点(“.”)开头的所有内容。这允许您拥有以点开头的隐藏功能:

.myHiddenFunction <- function(x) cat("my hidden function")

【讨论】:

  • 这在 RStudio 中对我来说失败了 - 错误:'\。'是从 ""^[^\." 开始的字符串中无法识别的转义
  • 如果我在使用我没有写的包时遇到错误,我可以做什么建议?包本身似乎想使用未定义的内部方法,因为大概作者没有这样做。
  • 这件事发生在我身上,因为我忘记在我的函数定义之前将@export 添加到 Roxygen2 前端。
【解决方案5】:

我有错误

错误:找不到函数some.function

在对我使用 RStudio 制作的包进行 R CMD 检查时发生。我发现添加

exportPattern(".")

到 NAMESPACE 文件就可以了。作为旁注,我最初将 RStudio 配置为使用 ROxygen 来制作文档——并选择了 ROxygen 为我编写我的 NAMESPACE 文件的配置,这会不断擦除我的编辑。所以,在我的例子中,我从 Roxygen 配置中取消选中 NAMESPACE,并将 exportPattern(".") 添加到 NAMESPACE 以解决这个错误。

【讨论】:

  • 您最好使用 roxygen2,它可以识别您对命名空间文件所做的编辑并保持它们完好无损。我还强烈建议不要在命名空间文件中使用 exportPattern(".") 。在您的单个文件中使用标签@export,因此您只导出需要导出的函数。 Roxygen2 会自动更新命名空间来导出所有需要导出的函数。
  • Joris - 非常感谢您抽出宝贵时间发表评论;我100%同意你写的。我现在正在使用 devtools/roxygen2 并将以下内容放入我需要导出的所有函数中:#' @export
【解决方案6】:

如果缺少一些强制参数(即您没有提供足够的参数),即使函数名称有效,也会发生此错误。
我在 Rcpp 上下文中得到了这个,在那里我编写了一个带有可选参数的 C++ 函数,并且没有在 R 中提供这些参数。看来来自 C++ 的可选参数被 R 视为强制性的。结果,R 找不到正确名称但参数数量不正确的匹配函数。

Rcpp 函数:SEXP RcppFunction(arg1, arg2=0) {}
R 调用:
RcppFunction(0) 引发错误
RcppFunction(0, 0) 没有

【讨论】:

    【解决方案7】:

    Rdocumentation.org 有一个非常方便的搜索功能 - 除其他外 - 可让您从 CRAN 上的所有包以及来自 Bioconductor 和 GitHub 的包中查找函数。

    【讨论】:

    • 好像他们已经删除了高级搜索
    【解决方案8】:

    如果您使用parallelMap,则需要将自定义函数导出到从属作业,否则会出现错误“找不到函数”。

    如果您在parallelStart 上设置了非缺失级别,则应将相同的参数传递给parallelExport,否则您会收到相同的错误。所以要严格遵守:

    parallelStart(mode = "<your mode here>", N, level = "<task.level>")
    parallelExport("<myfun>", level = "<task.level>")
    

    【讨论】:

      【解决方案9】:

      您也许可以通过名称间距::函数调用来修复此错误

      comparison.cloud(colors = c("red", "green"), max.words = 100)
      

      wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
      

      【讨论】:

      • 错误显示“比较”而不是“比较”。我认为命名空间不是问题:-)
      • 好地方@Joris Meys
      【解决方案10】:

      我也遇到了同样的错误,我运行的是 .99xxx 版本,我从帮助菜单中检查了更新并将我的 RStudio 更新到 1.0x,然后错误没有出现

      如此简单的解决方案,只需更新您的 R Studio

      【讨论】:

      • 能否请您详细说明错误的性质。这可能会有所帮助,但仅限于非常特殊的情况。
      猜你喜欢
      相关资源
      最近更新 更多