我希望选择要在图中显示的圆柱类型。 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'
那里隐藏着哪些无法强制转换为'双'矢量的名单?
答案 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) %>%
好的,因此图表将基于mpg
和wt
。两者都在数据框架中(我们从上面的步骤中知道)所以那里应该没有问题。您还可以将最后一行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;无法评估,因为它在运行代码时不存在,因此无法强制加倍。