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

时间:2011-08-11 14:04:19

标签: r function error-handling r-faq

  

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

     

This question was discussed and approved on meta.

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

Error: could not find function "some.function"

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

10 个答案:

答案 0 :(得分:111)

您应该检查一些事项:

  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中的说明在findFn软件包中使用sos
    4. RSiteSearch("some.function")或使用rdocumentationrseek进行搜索是查找功能的替代方法。
    5. 有时您需要使用较旧版本的R,但运行为较新版本创建的代码。然后将找不到新添加的函数(例如,R 3.4.0中的hasName)。如果您使用较旧的R版本并希望使用较新的功能,则可以使用包backports来使这些功能可用。您还可以找到需要在git repo of backports上反向移植的功能列表。请记住,早于R3.0.0的R版本与为R3.0.0及更高版本构建的软件包不兼容。

答案 1 :(得分:27)

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

例如(设计,我知道,但是):

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

首先,你不应该直接调用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>

所以我们现在可以直接使用:

来调用它
> 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返回内部变量名的值。

答案 2 :(得分:11)

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

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

答案 3 :(得分:5)

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

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

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

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

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

答案 4 :(得分:4)

我有错误

  

错误:找不到函数some.function

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

exportPattern( “”)

到NAMESPACE文件就可以了。作为旁注,我最初配置了RStudio来使用ROxygen来制作文档 - 并选择了ROxygen为我编写NAMESPACE文件的配置,这样就可以删除我的编辑内容。因此,在我的实例中,我从Roxygen配置中取消选中NAMESPACE,并将exportPattern(“。”)添加到NAMESPACE以解决此错误。

答案 5 :(得分:4)

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

Rcpp功能:SEXP RcppFunction(arg1, arg2=0) {}
R电话:
RcppFunction(0)提出错误 RcppFunction(0, 0)没有

答案 6 :(得分:2)

Rdocumentation.org有一个非常方便的搜索功能,除了其他功能外,还可以让你从CRAN上的所有软件包以及Bioconductor和GitHub中的软件包中找到函数。

enter image description here

答案 7 :(得分:1)

如果您使用parallelMap,则需要将自定义功能导出到从属作业,否则会出现错误&#34;无法找到功能&#34;。

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

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

答案 8 :(得分:0)

您可以通过名称间距:: 函数调用

来修复此错误
comparison.cloud(colors = c("red", "green"), max.words = 100)

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

答案 9 :(得分:-1)

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

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

即可