这是一个常见问题,请尽可能完整。答案是社区答案,因此,如果您认为缺少某些内容,请随时进行编辑。
已在meta上讨论并批准了此问题。

我正在使用R并尝试过some.function,但我知道错误消息如下:
Error: could not find function "some.function"

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

评论

在投票结束这个问题之前,请先阅读以下有关meta的讨论:meta.stackexchange.com/questions/101892/…

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

@nullglob似乎有点极端:-)

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

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

#1 楼

您应该检查几件事:


您是否正确编写了函数名称?名称区分大小写。
您是否安装了包含该功能的软件包? install.packages("thePackage")(只需执行一次)
您是否将该程序包附加到工作区?
require(thePackage)library(thePackage)(每次启动新的R会话时都应这样做)
您是否正在使用尚不存在该功能的旧R版本?

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


如果您确定已安装并附加/加载了正确的软件包,请键入help.search("some.function")??some.function以获得一个信息框,该信息框可以告诉您其中包含哪个软件包。

findgetAnywhere也可以用于查找函数。
如果对软件包一无所知,则可以可以按照此答案中的说明使用findFn软件包中的sos

RSiteSearch("some.function")或使用rdocumentation或rseek搜索是找到函数的替代方法。

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

评论


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

–本杰明
16年5月18日在20:45

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

–mpag
18年3月12日在18:01

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

– Joris Meys
18 Mar 12 '18 at 19:30

@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仓库并找出utils / R / hasName.R和base / R / match.R来归咎于它

–mpag
18年3月12日在22:45

@mpag,否则您可能会从字面上打开RSiteSearch(“ hasName”)中的第一个匹配项并获得相同的信息。这就是我几年前在此答案中添加的原因。知道这是一个有用的技巧;-)

– Joris Meys
18年3月13日在8:53

#2 楼

在存在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会报告它找不到该函数,除非您告诉它要查找的名称空间in。

将其与以下内容进行比较:
stats::plot.prcomp
上面的操作失败,因为尽管stats使用plot.prcomp,但由于错误正确地告诉我们,它并未从stats导出:


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


记录如下:


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


评论


谢谢-升级到R 3后,这救了我,因为找不到函数“ anova.lm” ...已通过调用stats ::: anova.lm()修复

– ErichBSchulz
2014年11月22日12:55

尽管无关紧要,但:::的使用已被称为设计错误,并且::是首选。无法随时找到参考。

–NelsonGon
19年5月7日在16:53



@NelsonGon在所有应得的尊重下,::和:::是不同的,您的编辑无效! plot.prcomp()函数不是从stats名称空间导出的,因此您需要使用:::。

–加文·辛普森(Gavin Simpson)
19年5月7日在18:47

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

–NelsonGon
19年5月8日在15:54

#3 楼

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

已经遇到了很多有点,这些步骤变得相当常规。尽管#7似乎是一个很好的起点,但它们以我使用它们的频率的近似顺序列出。

评论


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

– IRTFM
2011年8月11日15:09



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

–迭代器
2011年8月11日在16:51



#4 楼

如果在检查包裹(R CMD检查)时发生这种情况,请看一下您的NAMESPACE。您可以通过在NAMESPACE中添加以下语句来解决此问题:

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


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

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


评论


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

–安德鲁(Andrew)
2013年9月18日在15:00

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

– Andre Luus
15年6月23日在10:02

#5 楼

我遇到错误


错误:对RStudio进行RCMD检查时,找不到函数some.function


发生。我发现将

exportPattern(“。”)

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

评论


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

– Joris Meys
13年8月29日在9:11

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

– swihart
13年11月2日在21:06



#6 楼

即使缺少某些强制性参数(即您没有提供足够的参数),即使函数名称有效,也会发生此错误。
我在Rcpp上下文中得到此错误,其中我编写了带有可选参数的C ++函数,并且未在R中提供这些参数。看来R认为C ++中的可选参数是强制性的。因此,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
18 Mar 26 '18在20:08

好地方@Joris Meys

–托尼·克罗宁(Tony Cronin)
18年3月26日在21:01

#10 楼

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

这么简单的解决方案,只需更新您的R Studio

评论


您能否详细说明错误的性质。这可能有帮助,但仅在非常特殊的情况下。

– Joris Meys
16年11月18日在10:09