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

Error: could not find function ... in R

提问人: 提问时间:8/11/2011 最后编辑:15 revs, 8 users 46%Joris Meys 更新时间:8/2/2023 访问量:589696

问:

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

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

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

Error: could not find function "some.function"

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

函数 错误处理 R-FAQ

评论

5赞 Andrie 8/11/2011
在你投票结束这个问题之前,首先阅读这个关于元的讨论:meta.stackexchange.com/questions/101892/......
2赞 nullglob 8/11/2011
如果所有其他方法都失败了,请尝试获取基本 R 和已安装包的源代码
4赞 Gavin Simpson 8/11/2011
@nullglob这似乎有点极端:-)
0赞 Aleksandr Blekh 4/30/2014
我有一个相关问题:stackoverflow.com/questions/23357551/...。在这种情况下,ANY 命令失败,但是 !建议将不胜感激!Rq()
0赞 user3507584 9/14/2017
也许很傻,但要注意不要将函数的输出命名为函数本身。[从经验中学到......]

答:

147赞 12 revs, 9 users 40%Joris Meys #1

您应该检查以下几点:

  1. 你的函数名称写对了吗?名称区分大小写。
  2. 是否安装了包含该函数的软件包? (这只需要做一次)install.packages("thePackage")
  3. 您是否将该包附加到工作区? (并检查其返回值)或(每次启动新的 R 会话时都应执行此操作)require(thePackage)library(thePackage)
  4. 您是否正在使用尚不存在此函数的旧 R 版本?
  5. 您是否正在使用特定的不同版本?这可能是在任一方向上:函数会随着时间的推移而添加和删除,并且您引用的代码可能需要比您安装的包更新或旧版本。

如果不确定该函数位于哪个包中,可以执行一些操作。

  1. 如果您确定安装并附加/加载了正确的包,请键入 或获取一个信息框,该框可以告诉您它包含在哪个包中。help.search("some.function")??some.function
  2. find也可用于定位功能。getAnywhere
  3. 如果您对软件包一无所知,可以按照本答案中的说明在软件包中使用。findFnsos
  4. RSiteSearch("some.function")或者使用 rdocumentationrseek 进行搜索是查找函数的替代方法。

有时需要使用较旧版本的 R,但运行为较新版本创建的代码。届时将找不到新添加的函数(例如 R 3.4.0 中的 hasName)。如果使用较旧的 R 版本并希望使用较新的函数,则可以使用包向后移植来使此类函数可用。您还可以在向后移植的 git 存储库上找到需要向后移植的函数列表。请记住,早于 R3.0.0 的 R 版本与为 R3.0.0 及更高版本构建的包不兼容。

评论

0赞 Benjamin 5/19/2016
嗨,乔里斯,我有一个简短的问题。我是 R 的新手,但我能够成功安装它。我想从命令行使用“celestial”包中的“cosvol”函数。与从 Fedora 存储库安装到我的 Linux 系统中的 R 不同,我已经将我的“celestial”包下载到我“home”的不同目录中。每次我请求函数“cosvol()”时,它都会说“找不到函数”cosdistCoVol”。我不确定如何让 R 知道我的控制器,其中所有功能都单独下载到我的“天体”包中。感谢您的帮助。
0赞 mpag 3/13/2018
如果该函数位于某个核心/基本 R 库中,则可能需要对其进行更新。就我而言,我尝试使用中的函数。但是,我使用的是 3.3.1,直到 3.4.0 才被引入。由于您不能作为独立库进行更新,R/R Studio 说我没有任何库要更新。hasNameutilshasNameutils
0赞 Joris Meys 3/13/2018
@mpag 这是因为 utils 包是 R 版本不可或缺的一部分。如果从字面上使用 RSiteSearch(“hasName”),则第一个条目是对 backports 包的引用,该包将使该函数在 R 3.3.1 中可用。有关详细信息,另请参阅 github.com/r-lib/backports。我已经为这种情况添加了一些信息,谢谢通知
0赞 mpag 3/13/2018
@JorisMeys这很有帮助。我还想提出,当函数在函数的帮助页面上将函数添加到 R 时,记录应该是标准做法(例如?hasName)。例如,既不说也不说“在 R 3.4.0 中引入”,我最终通过浏览 github 存储库并查看 utils/R/hasName.R 和 base/R/match 来弄清楚它。Rhttps://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNamehttps://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmlblame
0赞 Joris Meys 3/13/2018
@mpag或者你可以从字面上打开第一个点击并得到相同的信息。这就是为什么我几年前在这个答案中加上了这一点。这是一个有用的技巧;-)RSiteSearch("hasName")
13赞 Iterator #2

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

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

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

评论

2赞 IRTFM 8/11/2011
可以肯定的是,有用的注意事项,但更多的是“为什么我在安装软件包时遇到错误”的答案。
0赞 Iterator 8/12/2011
@DWin:也许吧,但不是真的。我可能不清楚。当由于未安装包而在网格上作业停止时,就会出现这些问题。在网格上保持软件一致性并不难,但确实需要一个良好的安装、维护和调试过程。这些只是每个阶段出现的一些项目,至少当它们与功能不可用时发出的破坏声音有关。:)
32赞 3 revs, 2 users 78%Gavin Simpson #3

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

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

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

首先,您不应该直接调用 S3 方法,但让我们假设实际上是包 foo 中一些有用的内部函数。如果您知道自己在做什么,则要调用此类函数需要使用 。您还需要知道在其中找到函数的命名空间。使用时,我们发现该函数在包统计信息中: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)

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

将此与以下内容进行比较:上面失败了,因为在使用 时,它不会从错误正确告诉我们的那样导出:stats::plot.prcompstatsplot.prcompstats

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

具体记录如下:

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

评论

1赞 ErichBSchulz 11/22/2014
谢谢 - 这在升级到 R 3 后救了我......改用调用修复could not find function "anova.lm"stats:::anova.lm()
0赞 NelsonGon 5/8/2019
虽然不是那么相关,但使用已被称为设计错误,这是首选。无法轻易找到引用。:::::
1赞 Gavin Simpson 5/8/2019
@NelsonGon恕我直言,并且与众不同,您的编辑不起作用!该函数不会从 stats 命名空间导出,因此您需要使用 .:::::plot.prcomp():::
0赞 NelsonGon 5/8/2019
@GavinSimpson对!我接受了一位受人尊敬的 R 开发人员对设计错误的看法,但从未真正验证过它。也许,这是他们的个人意见。
8赞 3 revs, 3 users 84%Jacob #4

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

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

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

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

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

评论

0赞 Andrew 9/18/2013
这在 RStudio 中失败了 - 错误:“\.”是字符串中以“^[^\”开头的无法识别的转义。
1赞 Andre Luus 6/23/2015
如果我在使用不是我编写的包时遇到错误,我可以做些什么,有什么建议吗?包本身似乎想要使用未定义的内部方法,因为作者可能没有执行上述操作。
0赞 mattador 9/16/2021
这发生在我身上,因为我忘了在函数定义之前向 Roxygen2 前端添加@export。
6赞 swihart #5

我遇到了错误

错误:找不到函数some.function

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

exportPattern(“.”)

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

评论

2赞 Joris Meys 8/29/2013
你最好使用 roxygen2,它可以识别你对命名空间文件所做的编辑并保持它们完好无损。我还强烈建议不要在命名空间文件中使用 exportPattern(“.”)。在单个文件中改用标记 @export,以便仅导出需要导出的函数。Roxygen2 会自动更新命名空间,导出所有需要导出的函数。
2赞 swihart 11/3/2013
乔里斯 - 非常感谢您抽出宝贵时间发表评论;我 100% 同意你写的。我现在正在使用 devtools/roxygen2 并将以下内容放入我需要导出的所有函数中: #' @export
6赞 Math #6

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

Rcpp 函数:R 调用:

引发错误
SEXP RcppFunction(arg1, arg2=0) {}RcppFunction(0)RcppFunction(0, 0)

2赞 maj #7

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

enter image description here

评论

0赞 camille 12/26/2021
似乎他们已经删除了高级搜索
1赞 catastrophic-failure #8

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

如果在相同的参数上设置了一个不缺失的级别,则应传递给 ,否则将出现相同的错误。所以这应该严格遵守:parallelStartparallelExport

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
-2赞 Akshay Vijay Jain #9

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

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

评论

2赞 Joris Meys 11/18/2016
您能否详细说明错误的性质。这可能会有所帮助,但仅限于非常特殊的情况。
0赞 2 revsTony Cronin #10

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

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

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

评论

2赞 Joris Meys 3/27/2018
错误说的是“比较”而不是“比较”。我认为命名空间不是问题:-)
0赞 Tony Cronin 3/27/2018
梅斯@Joris好地方
0赞 user1089933 #11

找不到的函数可能不是命名的函数。我在使用 R/c.R 模块中的函数时遇到了此错误,该函数是在 R/a.R 模块中定义的,该模块以前在 R/b.R 中成功使用过,文件按 a、b、c 顺序提供。我传递的参数之一是全局参数。反过来,它是由一个函数设置的。该函数具有依赖项,而依赖项又存在错误。解决依赖项中的错误(也在 R/a.R 中定义)解决了该错误。这是惰性计算导致难以调试情况的众多情况之一。因此,如果错误看起来毫无意义,请仔细查看参数及其设置方式。