ggvis error: (list) object cannot be coerced to type 'double'

ggvis error: (list) object cannot be coerced to type 'double'

我想选择要在图中显示的圆柱体类型。 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'

里面到底隐藏着什么列表不能被强制转换为'double'向量?

您正在评估 input_checkboxgroup 的结果,其中 returns 是一个列表。所以问题就在那里,由于某种原因无法创建列表。由于您没有从(图表中没有 selection 输入)获得 select 的任何选项,因此无法评估 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) 

换句话说,使选择成为唯一值的列表,以便它们可以显示并可用于 selection。

查找隐藏在何处的列表

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

library(ggvis)

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

mtcars %>% 

mtcars 是用来制作绘图的数据框。没有任何形式的任务。此时检查数据框的 headers 以解释其余部分是有意义的,例如: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 文档中 "filter" 有点隐藏在 window 函数部分。

在我们的例子中,添加 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 pipe-substitution)。所以肯定是第二个cyl的问题所在。

要填充 input_checkboxgroup,我们需要一个包含 selection 的值列表(您的 "hidden list" 提示了这个问题)。由于某种原因,dplyr 样式管道在这里不起作用,因此我们必须指定我们的意思是 cyl 是 mtcars 数据框中的一列。例如:

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

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

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

现在你有了上面更正的代码,你知道第一个错误中的 "list" 是无法计算的 `input_checkboxgroup' 期望的列表,并且因为它运行在代码中不存在,因此无法强制加倍。