错误: 在 R 中找不到函数

这是一个常见问题,所以请尽可能完整。答案是一个社区的答案,所以如果你认为有什么东西不见了,请随意编辑。

这个问题在 meta 上得到了讨论和批准。

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

Error: could not find function "some.function"

这个问题经常出现,当你在 R 中得到这种类型的错误,你怎么解决它?

548321 次浏览

有几件事你应该检查:

  1. 函数名写对了吗?名称区分大小写。
  2. 您是否安装了包含该功能的包?install.packages("thePackage")(这只需要做一次)
  3. 你把那个包附加到工作空间了吗? require(thePackage)(并检查它的返回值)或library(thePackage)(这应该在每次你开始一个新的R会话时执行)
  4. 您使用的是还不存在此函数的旧R版本吗?
  5. 是否使用了特定的不同版本?这可能是两种情况:随着时间的推移,函数会被添加或删除,并且您所引用的代码可能希望使用比您所安装的包更新或旧版本的包。

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

  1. 如果你确定你安装并附加/加载了正确的包,输入help.search("some.function")??some.function来获得一个信息框,告诉你它包含在哪个包中。
  2. findgetAnywhere也可以用来定位函数。
  3. 如果你对这个包没有任何线索,你可以在sos包中使用findFn,如这个答案所述。
  4. RSiteSearch("some.function")或使用rdocumentationrseek搜索是查找函数的替代方法。

有时您需要使用旧版本的R,但运行为新版本创建的代码。新添加的函数(如R 3.4.0中的hasName)将不会被发现。如果你使用一个较旧的R版本,并且想要使用一个较新的函数,你可以使用包补丁来提供这样的函数。你还可以找到一个需要在Git回购后台端口上反向移植的函数列表。请记住,R3.0.0之前的R版本与为R3.0.0及更高版本构建的包不兼容。

当计算机在我的控制下时,我通常可以解决这个问题,但当使用网格时,它更麻烦。当网格不是同质的时,可能不会安装所有的库,我的经验经常是由于没有安装依赖项而没有安装包。为了解决这个问题,我检查了以下内容:

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

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

另一个问题是,在存在命名空间的情况下,您试图从包喷火运行一个未导出的函数。

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

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

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

> 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导出的,因为错误正确地告诉我们:

错误:“阴谋。Prcomp不是从namespace:stats导出的对象

记录如下:

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

如果在检查包(R CMD检查)时发生这种情况,请查看您的命名空间。

你可以通过在命名空间中添加以下语句来解决这个问题:

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

这将导出所有不以点(".")开头的内容。这允许你有你的隐藏函数,从一个点开始:

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

我犯了错误

错误:无法找到函数some.function

当我用RStudio做一个包的R CMD检查时发生。我发现

exportPattern(“。”)

命名空间文件成功了。作为旁注,我最初配置了RStudio,让它使用ROxygen来制作文档——并选择了ROxygen为我编写NAMESPACE文件的配置,这将不断擦除我的编辑。因此,在我的实例中,我从Roxygen配置中取消了NAMESPACE,并向NAMESPACE添加了exportPattern(“.”)来解决这个错误。

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

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

Rdocumentation.org有一个非常方便的搜索函数,它可以让你从CRAN上的所有包中,以及从Bioconductor和GitHub的包中找到函数。

enter image description here

如果你正在使用parallelMap,你需要将自定义函数导出到从作业,否则你会得到一个错误“无法找到函数”。

如果你在parallelStart上设置了一个非缺失的级别,同样的参数应该传递给parallelExport,否则你会得到同样的错误。所以这一点应该严格遵守:

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

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

所以很简单的解决方法,就是更新你的R Studio

你可以在函数调用时修复这个错误

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

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