【问题标题】:ggvis error: (list) object cannot be coerced to type 'double'ggvis 错误:(列表)对象不能被强制输入'double'
【发布时间】:2016-05-22 09:15:21
【问题描述】:

我希望选择要在图中显示的圆柱类型。 Hadley Wickham 在 https://groups.google.com/forum/#!topic/ggvis/AJZCdjFcNaE

library(ggvis)
mtcars %>% 
 ggvis(~mpg, ~wt) %>% 
 filter(cyl %in% eval(input_checkboxgroup(cyl, selected = '4'))) %>% 
 layer_points(fill = ~cyl) 

还是会报错:

(list) object cannot be coerced to type 'double'

究竟隐藏了哪些列表不能被强制转换为“双重”向量?

【问题讨论】:

  • 您可能需要使用library(lazyeval) 或查看library(dplyr); help("nse")

标签: r ggvis


【解决方案1】:

您正在评估返回列表的input_checkboxgroup 的结果。所以问题就在那里,由于某种原因无法创建列表。由于您没有任何选项可供选择(图表中没有选择输入),因此无法评估 input_checkboxgroup 的结果。

我纠正代码的粗略方法是:

library(dplyr)    
library(ggvis)

mtcars %>% 
  ggvis(~mpg, ~wt) %>% 
  filter(cyl %in% eval(input_checkboxgroup(choices=unique(mtcars$cyl), 
    selected = "4"))) %>% 
  layer_points(fill = ~cyl) 

换句话说,将选项设置为唯一值列表,以便它们可以显示并可供选择。

查找列表隐藏在哪里

如果您逐行查看代码,您会看到以下内容:

library(ggvis)

您只加载了ggvis 库(因此,如果我们认为ggvis 中没有其他任何内容,我们可以开始寻找丢失的包)。

mtcars %>% 

mtcars 是用于制作绘图的数据框。没有任何类型的任务。此时检查数据帧的标题以解释其余部分是有意义的,例如:colnames(mtcars)str(mtcars)

  ggvis(~mpg, ~wt) %>% 

好的,所以图表将基于mpgwt。两者都在数据框中(我们从上面的步骤中知道)所以那里应该没有问题。您还可以将最后一行 layer_points(fill = ~cyl) 识别为 ggvis 指令,并且我们确实将 cyl 作为数据框中的一列。

所以剩下的就是filter(...)。这应该不足为奇,因为抛出的完整错误是:

Error in filter(., cyl %in% eval(input_checkboxgroup(cyl, selected = "4"))) : 
  (list) object cannot be coerced to type 'double'

如果你看线本身:

filter(cyl %in% eval(input_checkboxgroup(cyl, selected = '4'))) %>% 

您可能会认识到过滤器不是ggvis 函数。如果没有,您可以使用?ggvis 查看ggvis 的帮助页面并转到索引。您将看到那里没有列出 filter 函数。所以现在您知道缺少功能。该函数的来源可能是您正在处理的代码中其他地方定义的包或函数。

我们还知道filter 的结果基于ggvis 图中的交互式元素 (input_checkboxgroup)。而且我们知道结果无法评估,因为我们看不到任何情节。

因此,如果您排除任何与ggvis 相关的项目,您会得到如下一小段代码:

selected_cyl <- mtcars %>%
  filter(cyl %in% '4')

这又会引发错误:

Error in match(x, table, nomatch = 0L) : object 'cyl' not found

有道理,对吧?因为实际上我们没有在任何地方定义cyl。我们知道它是数据框中的一列。

在这样的示例中,函数很可能来自 dplyr 或 tidyr。大多数当前代码将使用其中任何一个。除此之外,确切地知道有点困难。搜索 CRAN 上的所有函数名称(使用包 sos 使用 `sos::findFn("filter") 不会给你答案,不幸的是。在 dplyr 文档中,“过滤器”有点隐藏在窗口函数部分.

在我们的例子中,添加 dplyr 将使其工作:

library(dplyr)
selected_cyl <- mtcars %>%
  filter(cyl %in% '4')

现在回到我们开始的代码,但将dplyr 作为一个包加载。我们收到一个新错误:

Error in lapply(obj, function(val) { : object 'cyl' not found

看起来很像我们刚刚在上面更正的那个,只是 match 中没有错误,我们现在在 lapply 中出现错误。我们还知道正确找到了对cyl 的第一个引用(使用dplyr 管道替换)。所以肯定是在第二个cyl有问题的地方。

要填充input_checkboxgroup,我们需要一个带有选择的值列表(提示此问题的“隐藏列表”)。 dplyr 样式管道由于某种原因在这里不起作用,因此我们必须指定我们的意思 cyl 是来自 mtcars 数据框的列。例如:

filter(cyl %in% eval(input_checkboxgroup(mtcars$cyl, 
                                           selected = "4"))) %>% 

但是,如果您包含该行,则整行 cyl 将显示为输入选项,并选择所有出现的 4。但它现在会运行。所以唯一缺少的就是使提供给选择的值是唯一的:

filter(cyl %in% eval(input_checkboxgroup(choices = unique(mtcars$cyl), 
  selected = "4"))) %>%

现在您有了上面的更正代码,并且您知道第一个错误中的“列表”是 `input_checkboxgroup' 预期的列表,无法评估,因为它在运行代码时不存在,并且因此不能被强制加倍。

【讨论】:

  • 不幸的是,同样的错误仍然存​​在。您是否设法在没有弹出错误的情况下运行它?
  • 抱歉,忘记在要加载的包中添加dplyr。您能否使用已编辑答案中的 sn-p 再试一次?
  • 非常感谢。我不明白。包含 dplyr 如何使列表正确强制转换为双精度向量?
  • @Amitai 希望我能够解释我认为在编辑问题时发生的事情。
猜你喜欢
  • 2016-09-30
  • 2016-05-24
  • 1970-01-01
  • 2017-08-29
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多