ggvis错误:(列表)对象无法强制输入'double'

时间:2016-02-11 14:26:54

标签: r ggvis

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

那里隐藏着哪些无法强制转换为'双'矢量的名单?

1 个答案:

答案 0 :(得分:2)

您正在评估返回列表的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的结果基于input_checkboxgroup图中的互动元素(ggvis)。我们知道结果无法评估,因为我们看不到情节。

因此,如果您将任何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(&#34; filter&#34;)将无法给出答案。在dplyr文档&#34; filter& #34;有些隐藏在窗口函数部分。

在我们的案例中,添加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,我们需要一个带有选择的值列表(您的&#34;隐藏列表&#34;提示此问题)。由于某些原因,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"))) %>%

现在您已经修改了上面的代码,并且您知道&#34;列表&#34;在第一个错误中是`input_checkboxgroup&#39;无法评估,因为它在运行代码时不存在,因此无法强制加倍。