do.call(.f, args, envir = .env) 中的警告:“what”必须是函数或字符串是什么意思

问题描述 投票:0回答:3

这是确切的消息:

Warning in do.call(.f, args, envir = .env) :
  'what' must be a function or character string

在 Azure Databricks 环境中使用 R、spark 和 tidyverse 进行数据处理。 即使运行空命令单元格也会出现此消息。

  • 这可能来自 Databricks UI 中的集群配置吗? 我正在加载以下库:
# library(sparklyr)
# library(lubridate)
# library(dplyr)
# library(purrr)
# library(httr)
# library(jsonlite)
# library(tidyr)
# library(arrow)
# library(stringr)
# library(DBI)
# library("readxl")

我用

# if(!require(*library*)){
#   install.packages(*"library"*)
# }

这个警告是我应该担心的还是应该检查的?我不明白这个警告,也无法在谷歌上找到正确的文档。

r apache-spark tidyverse databricks azure-databricks
3个回答
2
投票

在我看来,是否有某个天才包维护者屏蔽了(~覆盖)了一些重要的东西,或者在

do.call
中使用了(函数的)名称而不是字符串。

您可以像这样重现问题。

do.call(rbind, list())  ## using the name works as expected
# NULL

现在我们来敷面膜吧

rbind

rbind <- 1
do.call(rbind, list())  ## using the name fails
# Error in do.call(rbind, list()) : 
#   'what' must be a function or character string

瞧。

这里使用字符串比较安全,不会失败。

do.call('rbind', list())
# NULL

rm(rbind)  ## unmask `rbind`.

解决方案很棘手,因为您正在加载大量的库。不过,您可以执行以下操作:

    关闭 R 会话,如果使用 RStudio,请取消选中
  1. 工具 > 全局选项 > 常规 > 恢复 .RData (也许取消选中已经解决了问题!)
  2. 检查
  3. Renviron.site
    Renviron.site
     文件中是否存在异常条目(可以在 Linux 上的 
    /etc/R/
     文件夹中找到),或者启动 
    R -vanilla
     会话
  4. 开始新的 R 会话
  5. 逐一加载各个
  6. library
    ,直到出现错误为止

1
投票
这个答案的范围非常有限,但想分享。

当我加载整个 tidyverse 时,我在 Databricks 中也遇到了这个错误,但是当我只加载 dplyr 和 ggplot2 时,我没有得到它。


0
投票
我也在 Databricks 上遇到了这个问题。这是由于

invoke

sparklyr
 之间的 
purrr
 功能发生冲突。请参阅 github 上的
此处

嗯,这有点尴尬,但我会把它留在这里,以防其他人遇到同样的问题。这里的问题是我在一些处理中使用 purrr 包,并且它是在 Sparklyr 之后加载的。由于 purrr 也有一个 invoke() 函数,因此它屏蔽了 Sparklyr::invoke 函数。

因此,解决方案是要么不将 purrr 加载到命名空间中,并在使用的任何 purrr 函数前面使用 purrr:: ,要么每次要调用 Sparklyr 的函数时都使用 Sparklyr::invoke() 。

© www.soinside.com 2019 - 2024. All rights reserved.