这是确切的消息:
Warning in do.call(.f, args, envir = .env) :
'what' must be a function or character string
在 Azure Databricks 环境中使用 R、spark 和 tidyverse 进行数据处理。 即使运行空命令单元格也会出现此消息。
# 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"*)
# }
这个警告是我应该担心的还是应该检查的?我不明白这个警告,也无法在谷歌上找到正确的文档。
在我看来,是否有某个天才包维护者屏蔽了(~覆盖)了一些重要的东西,或者在
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`.
解决方案很棘手,因为您正在加载大量的库。不过,您可以执行以下操作:
Renviron.site
和
Renviron.site
文件中是否存在异常条目(可以在 Linux 上的
/etc/R/
文件夹中找到),或者启动
R -vanilla
会话
library
,直到出现错误为止
当我加载整个 tidyverse 时,我在 Databricks 中也遇到了这个错误,但是当我只加载 dplyr 和 ggplot2 时,我没有得到它。
invoke
和
sparklyr
之间的
purrr
功能发生冲突。请参阅 github 上的此处。
嗯,这有点尴尬,但我会把它留在这里,以防其他人遇到同样的问题。这里的问题是我在一些处理中使用 purrr 包,并且它是在 Sparklyr 之后加载的。由于 purrr 也有一个 invoke() 函数,因此它屏蔽了 Sparklyr::invoke 函数。
因此,解决方案是要么不将 purrr 加载到命名空间中,并在使用的任何 purrr 函数前面使用 purrr:: ,要么每次要调用 Sparklyr 的函数时都使用 Sparklyr::invoke() 。