错误:在R中找不到函数....

Jor*_*eys 167 error-handling r function r-faq

这是一个FAQ问题,所以请尽可能完整.答案是社区答案,如果您认为缺少某些内容,请随时编辑.

这个问题在meta上进行了讨论和批准.

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

Error: could not find function "some.function"
Run Code Online (Sandbox Code Playgroud)

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

Jor*_*eys 116

你应该检查几件事:

  1. 你有没有正确地写出你的功能名称?名称区分大小写.
  2. 您是否安装了包含该功能的软件包?install.packages("thePackage")(这只需要做一次)
  3. 您是否将该包附加到工作区? require(thePackage)library(thePackage)(每次开始新的R会话时都应该这样做)
  4. 您使用的是较旧的R版本,但此功能尚不存在吗?

如果您不确定该功能所在的软件包,您可以做一些事情.

  1. 如果您确定已安装并附加/加载了正确的软件包,请键入help.search("some.function")??some.function获取一个信息框,该信息框可以告诉您包含它的软件包.
  2. find并且getAnywhere还可以用于定位功能.
  3. 如果你不知道包的线索,您可以使用findFnsos包装中解释这个答案.
  4. RSiteSearch("some.function")或使用rdocumentationrseek搜索是查找函数的替代方法.

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


Rei*_*son 28

在存在NAMESPACE的情况下,另一个问题是你试图从包foo运行一个未导出的函数.

例如(人为,我知道,但是):

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

首先,你不应该直接调用S3方法,但假设plot.prcomp在包foo中实际上是一些有用的内部函数.如果您知道自己在做什么,要调用此类函数需要使用:::.您还需要知道找到该函数的命名空间.使用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>
Run Code Online (Sandbox Code Playgroud)

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

> stats:::plot.prcomp(mod)
Run Code Online (Sandbox Code Playgroud)

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


Ite*_*tor 11

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

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

遇到这个问题后,其中一些步骤变得相当常规.尽管#7似乎是一个很好的起点,但它们按照我使用它们的频率的近似顺序列出.

  • 有用的考虑因素可以肯定,但更多的答案是"为什么我在安装软件包时会出错". (2认同)

小智 6

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

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

exportPattern("^[^\\\\.]")
Run Code Online (Sandbox Code Playgroud)

这会导出所有不以点(".")开头的内容.这允许您从点开始隐藏功能:

.myHiddenFunction <- function(x) cat("my hidden function")
Run Code Online (Sandbox Code Playgroud)


swi*_*art 5

我有错误

错误:找不到函数 some.function

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

出口模式(“。”)

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

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

Mat*_*ath 5

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

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