【问题标题】:Why do I get "Error: `...` is not empty" in R?为什么我在 R 中得到“错误:`...` 不是空的”?
【发布时间】:2020-06-29 12:40:41
【问题描述】:

我是一个 Python 人,被要求运行一些返回以下错误的 R 代码:

错误:... 不为空。

我们检测到这些有问题的论点:

  • ..1

这些点仅用于允许将来扩展,应该为空。 你是否错误地指定了一个论点?运行rlang::last_error() 看看在哪里 发生错误。

我可以将代码简化为这个 MWE:

library(dplyr)
x <- data.frame(1)
x %>% ungroup(x)

我不知道第 3 行应该做什么,但它在我的系统 (dplyr 1.0.0) 上失败,同时使用 dplyr 0.8.5 或https://rdrr.io/snippets/,它打印在哪里

  X1
1  1

我尝试了很多事情,但没有成功:

update.packages(ask = FALSE)
remove.packages("dplyr")
install.packages("dplyr")

这里发生了什么?我该如何(帮助)调查?

更新options(error = recover) 给了我这个:

 1: x %>% ungroup(x)
 2: withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
 3: eval(quote(`_fseq`(`_lhs`)), env, env)
 4: eval(quote(`_fseq`(`_lhs`)), env, env)
 5: `_fseq`(`_lhs`)
 6: freduce(value, `_function_list`)
 7: withVisible(function_list[[k]](value))
 8: function_list[[k]](value)
 9: ungroup(., x)
10: ungroup.data.frame(., x)
11: ellipsis::check_dots_empty()
12: action_dots(action = action, message = "`...` is not empty.", dot_names = n
13: action(message, .subclass = c(.subclass, "rlib_error_dots"), ...)
14: signal_abort(cnd)

另一个更新complete line of code,非最小化,如果重要的话,是

screenData <- mutate_if(screenData, is.character, as.factor) %>% ungroup(screenData)

也许这比我的 MWE 更有意义。

另一个dput(screenData)返回

structure(list(wellID = "A001", rowID = "A0", colID = "01", value = 0, 
    fileName = "V3_Prob5_p1", batch = structure(NA_integer_, .Label = character(0), class = "factor"), 
    sampleID = NA, patientID = NA, name = NA_character_, concentration = NA_real_, 
    wellType = "sample"), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"))

最后,我向代码的维护者提出了一个问题,请参阅https://github.com/lujunyan1118/DrugScreenExplorer/issues/1, 和dplyr,见https://github.com/tidyverse/dplyr/issues/5368

【问题讨论】:

  • 我在未加载包 'dplyr' 时收到此错误。你确定已经安装然后用library(dplyr)正确加载dplyr@
  • 跟随 ljwharbers 评论,尝试:x % dplyr::ungroup(x) 告诉我们它是否有效
  • @ljwharbers 什么?不。当包没有加载时,你会得到一个不同的错误(“找不到函数‘ungroup’”)。
  • x %&gt;% ungroup(x) 运行 ungroup(x,x)
  • @LeonIpdjian 没有library(dplyr),无法找到%&gt;%。使用library(dplyr),和以前一样的错误。

标签: r dplyr


【解决方案1】:

管道%&gt;% 是语法糖。它的意思是“将管道左侧的对象作为管道右侧函数的第一个参数”。

所以你可以说ungroup(x)x %&gt;% ungroup(),两者都有效,但x %&gt;% ungroup(x) 试图将名为x 的data.frame 取消组合并从分组中删除名为x 的变量data.frame 称为x。但data.frame x 不包含名为x 的变量。于是就有了问题。

你得到的代码本质上是错误的(或者至少是令人困惑的)。

更新 关注你dput的帖子。

screenData %&gt;% ungroup(screenData) 等价于ungroup(screenData, screenData),其中第一个screenData 是要取消分组的data.frame,第二个是要从分组中删除的data.frame 中的变量名称。但 data.frame screenData 不包含名为 screenData 的列。这就是你得到错误的原因。

您得到的代码显然不正确。

它在dplyr 的早期版本中运行没有错误的事实纯属偶然。

【讨论】:

  • 您的答案的第一部分是正确的,但是您对带有多个参数的 ungroup 所做的解释是错误的:正如错误消息所说,ungroup 根本不接受多个参数全部。
  • @KonradRudolph:来自在线文档:“...在 group_by() 中,要分组的变量或计算。在 ungroup() 中,要从分组中删除的变量。”。我还认为ungroup 在我检查之前没有接受其他论点。 [dplyr 1.0.0 版]
  • 确实如此。 data.frame 的错误消息显然已经过时,它错误地指出 ungroup 没有额外的参数。
  • 那么请发布dput(screenData)dput(head(screenData) 的结果,以便我们尝试重现您的问题。目前,我们只能给您理论上的建议。尽管如此,我同意@KonradRudolph:x %&gt;% ungoup(x) 或类似的观点几乎肯定是不正确的。
  • 正如@KonradRudolph 和我所说,screenData &lt;- mutate_if(screenData, is.character, as.factor) %&gt;% ungroup()。这将适用于dplyr v0.8.x 和 v1.0.0,因此当您的主机升级到 v1.0.0 时,您还可以节省维护任务。
【解决方案2】:

ungroup 函数不接受额外的参数。您提供的代码是错误的。从ungroup 调用中删除x

【讨论】:

  • 我不确定这是否正确,查看 cran.r-project.org/web/packages/dplyr/dplyr.pdf 的第 30 页,其中显示了 ungroup(x, ...)。此外,代码在rdrr.io/snippets 上运行时不会出错
  • @bers 这个答案在你的问题的上下文中是正确的,尽管 Limey 的答案更好更完整。无论哪种方式,sn-p 在 rdrr.io 上运行的事实是因为该网站使用了一个过时的 dplyr 版本和一个错误的ungroup 实现。该错误随后被修复,因此出现错误消息。无论哪种方式,您收到的代码 都是 错误的。实际上,在您发布的链接中,整个ungroup 调用是多余的,应该删除。
  • 那么你是说“ungroup 函数不需要额外的参数”。是正确的?那么省略号是什么意思呢?
  • 顺便说一下,降级devtools::install_version("dplyr", version="0.8.5") 已修复/规避/...问题。谢谢!
  • 我强烈建议您更正您的代码。问题没有解决:您只有两个相互抵消的错误。你有错误的代码运行没有错误(而不是“工作”)纯粹是偶然的。见我上面的回答。
【解决方案3】:

tibble 包似乎有问题。 See here.

更新tibble 为我解决了这个问题。

【讨论】:

  • 错误信息相同,但问题无关。事实上,OP 的问题早于导致您链接到的错误的“支柱”版本。
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 2016-04-16
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多