您正在评估返回列表的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 的结果基于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' 预期的列表,无法评估,因为它在运行代码时不存在,并且因此不能被强制加倍。