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


177

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

该问题已在meta上进行了讨论和批准。

我正在使用R并尝试过,some.function但是出现以下错误消息:

Error: could not find function "some.function"

这个问题经常出现。当您在R中遇到此类错误时,如何解决呢?


5
在您投票关闭这个问题之前,请先阅读有关meta的讨论:meta.stackexchange.com/questions/101892/…–
Andrie

2
如果其他所有方法均失败,请尝试为base R和已安装的软件包添加源代码
nullglob,

3
@nullglob似乎有些极端:-)
加文·辛普森

我有一个相关的问题:stackoverflow.com/questions/23357551/…。在这种情况下,ANY R命令失败,但是q()!建议将不胜感激!
Aleksandr Blekh

也许很愚蠢,但请注意不要将函数的输出命名为函数本身。[通过经验学习...]
user3507584

Answers:


126

您应该检查以下几件事:

  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的git repo上找到需要反向移植的功能列表。请记住,早于R3.0.0的R版本与为R3.0.0和更高版本构建的软件包不兼容。


嗨,Joris,我有一个简短的问题。我是R语言的新手,但我能够成功安装它。我想从命令行使用“天体”软件包中的“ cosvol”功能。与从Fedora存储库安装到Linux系统中的R不同,我将“天体”软件包下载到了“主目录”中的其他目录中。每当我请求函数“ cosvol()”时,都会说“找不到函数“ cosdistCoVol”。” 我不确定如何让R知道我的导演,其中所有功能都单独下载到“天体”软件包中。感谢您的帮助。
本杰明

如果该功能位于核心/基本R库之一中,则可能需要对其进行更新。就我而言,我试图在中使用该hasName函数utils。但是,我使用的是3.3.1,hasName直到3.4.0才引入。由于您不能utils作为独立库进行更新,因此R / R Studio说我没有要更新的库。
mpag

@mpag这是因为utils包是R发行版的组成部分。如果从字面上使用RSiteSearch(“ hasName”),则第一个条目是对backports包的引用,它将使该功能在R 3.3.1中可用。另请参见github.com/r-lib/backports。我已经添加了这种情况下,通知的一些信息,THX
里斯Meys

@JorisMeys很有帮助。我还想提出,将某个函数添加到该函数的帮助页面上的R中(例如?hasName)时,应该以此为惯例。如没有https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasName,也没有https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.html说“中的R 3.4.0推出的”我最终通过GitHub的回购协议,并期待在浏览计算出来的blame对utils的/ R / hasName.R和底座/ R / match.R
MPAG

@mpag或您可能已经打开了第一个匹配项RSiteSearch("hasName")并获得了相同的信息。这就是我几年前在此答案中添加的原因。知道这是一个有用的技巧;-)
Joris Meys

29

在存在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.prcompstats由于错误正确地告诉了我们,它不会从中导出:

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

记录如下:

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


1
感谢-这为我节省了升级后至R 3 could not find function "anova.lm"...固定调用stats:::anova.lm(),而不是
ErichBSchulz

尽管无关紧要,但使用:::却被称为设计错误,因此::是首选。无法轻易找到参考。
NelsonGon

1
@NelsonGon恕我直言,:::::不同的,你的编辑不工作!该plot.prcomp()函数不是从stats名称空间导出的,因此您需要使用:::
加文·辛普森,

@GavinSimpson对!我对设计错误怀有尊敬的R开发人员的话,但从未真正验证过它。也许,这是他们的个人看法。
NelsonGon

11

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

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

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


2
可以肯定的是有用的注意事项,但更多的答案是“为什么在安装软件包时出现错误”。
IRTFM 2011年

@DWin:也许吧,但不是真的。我可能不清楚。当作业由于未安装软件包而停在网格上时,就会出现这些问题。维护网格上的软件一致性并不难,但是确实需要一个良好的安装,维护和调试过程。这些只是每个阶段中出现的一些项目,至少与​​它们在某个功能不可用时发出的尖叫声有关。:)
Iterator

6

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

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

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

这将导出所有不以点(“。”)开头的内容。这使您可以从点开始拥有隐藏功能:

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

这在RStudio中对我而言失败-错误:“ \”。是无法识别的以“” ^ [^ \。“开头的字符串中的转义字符
Andrew

1
如果我在使用未编写的程序包时出现错误,该怎么办?程序包本身似乎想使用未定义的内部方法,因为推测作者没有执行上述操作。
Andre Luus 2015年

4

我有错误

错误:找不到功能 some.function

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

exportPattern(“。”)

到NAMESPACE文件中就可以了。附带说明,我最初配置RStudio使用ROxygen来制作文档-并选择了ROxygen将为我编写我的NAMESPACE文件的配置,该配置会不断删除我的编辑内容。因此,在我的实例中,我未选中Roxygen配置中的NAMESPACE,并向NAMESPACE添加了exportPattern(“。”)以解决此错误。


1
您最好使用roxygen2,它可以识别您对名称空间文件所做的编辑并使它们保持完整。我也强烈建议不要在名称空间文件中使用exportPattern(“。”)。请在各个文件中使用标记@export,以便仅导出需要导出的功能。Roxygen2将自动更新名称空间以导出所有需要导出的功能。
约里斯·梅斯

1
Joris-非常感谢您抽出宝贵时间发表评论;我100%同意你的话。我现在正在使用devtools / roxygen2,并将以下内容放入需要导出的所有功能中:#'@export
swihart 2013年

4

即使缺少某些必需参数(即您没有提供足够的参数),即使函数名称有效,也会发生此错误。
我是在Rcpp上下文中得到的,在该上下文中,我编写了带有Optionnal参数的C ++函数,并且未在R中提供这些参数。看来R认为C ++中的Optionnal参数是强制性的。因此,R找不到名称正确但参数数量错误的匹配函数。

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


2

Rdocumentation.org具有非常方便的搜索功能,除其他功能外,它使您可以从CRAN上的所有软件包以及Bioconductor和GitHub的软件包中找到函数。

在此处输入图片说明


1

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

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

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

0

您可以通过名称间距::函数调用来解决此错误

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

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

1
错误显示“比较”而不是“比较”。我认为名称空间不是问题:-)
Joris Meys

好地方@Joris Meys
Tony Cronin

-1

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

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


1
您能否详细说明错误的性质。这可能有帮助,但仅在非常特殊的情况下。
Joris Meys
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.