我正在使用ggvis并在UI端使用selectInput使用以下代码,允许用户选择哪个变量指示填充和形状(inputId分别是fill和shape)。我希望绘图能够在用户选择时具有恒定的填充或形状。这段代码的else部分正是我想要的,但当我在if语句中选择该选项时,应用程序崩溃时出现以下错误:
Error in eval: could not find function ":="
我知道我的语法是正确的,因为如果我压缩了图例和if / else语句并将填充指定为常量(fill:=&#34; black&#34;)它的工作原理是我想要的。< / p>
任何帮助都将不胜感激。
vis <- reactive({
fillvar <- prop("fill", as.symbol(input$fill))
shapevar <- prop("shape", as.symbol(input$shape))
filteredData() %>%
ggvis(x = xvar, y = yvar) %>%
layer_points(size.hover := 200,
fillOpacity:= 0.5, fillOpacity.hover := 1,
# Allows for points to be consistent if the user desires
if (input$fill == "All Points Black") {
fill := "black"}
else {
fill = fillvar}
,
if (input$shape == "All Points Circles") {
shape := "circle"}
else {
shape = shapevar}
,
key := ~ID
) %>%
# Adds legends to the Plot in designated locations
add_legend("fill", title = as.character(fillvar)) %>%
add_legend("shape", title = as.character(shapevar), properties = legend_props(legend = list(y=300))) %>%
# Adds the previously defined tool_tip my_tooltip
add_tooltip(my_tooltip, "hover") %>%
# Specifies the size of the plot
set_options(width = 800, height = 400, duration = 0)
})
#Actually plots the data
vis %>% bind_shiny("plot1")
答案 0 :(得分:1)
正如我在评论中提到的,您可以使用prop
语句为if
创建变量。这样,您就可以直接在:=
中使用常量或变量来绕过prop
的问题。
你自动获得传说。要在有两个图例(这会导致重叠)时控制展示位置,您可以为ggvis
图表命名。这允许您引用向图形添加元素,以便仅在根据逻辑以及shapevar
和fillvar
值添加第二个图例时将其向下移动。
这是反应函数的代码。
vis <- reactive({
fillvar = "black"
if(input$fill != "All Points Black") {
fillvar = as.name(input$fill)
}
shapevar = "circle"
if(input$shape != "All Points Circles") {
shapevar = as.name(input$shape)
}
p1 = filteredData() %>%
ggvis(x = xvar, y = yvar) %>%
layer_points(size.hover := 200,
fillOpacity:= 0.5, fillOpacity.hover := 1,
prop("fill", fillvar),
prop("shape", shapevar),
key := ~ID
) %>%
# Adds the previously defined tool_tip my_tooltip
add_tooltip(my_tooltip, "hover") %>%
# Specifies the size of the plot
set_options(width = 800, height = 400, duration = 0)
# Control addition of second legend using if() on p1 object
if(fillvar != "black" & shapevar != "circle") {
p1 %>% add_legend("shape", properties = legend_props(legend = list(y=300)))
}
else {
p1
}
})
答案 1 :(得分:0)
现在,代码现在可以通过@aosmith输入来实现,因为我想要它是否被抑制。但是,当我这样做时,填充和形状的图例会重叠,因为此帖子会解决。
legends on ggvis graph are overlaping when using tooltip
修复此问题是添加一个图例,如果选择了常量数据可视化选项,则会使图形消失。我将发布一个新问题,尝试解决此问题。
更新:下面的答案解决了原始问题,但@ aosmith的答案修正了在纠正第一个问题后出现的第二个问题。
我的代码包含已更正的原始问题,但包含重叠的图例(使用@ aosmith&#39;答案更正),如下所示。
vis <- reactive({
# Allows for points to be consistent if the user desires
if (input$fill == "All Points Black") {
fillvar = "black"}
else {
fillvar <- as.symbol(input$fill)}
if (input$shape == "All Points Circles") {
shapevar = "circle"}
else {
shapevar <- as.symbol(input$shape)}
#Plot Data with Visualization Customization
xvar <- prop("x", as.symbol(input$x))
yvar <- prop("y", as.symbol(input$y))
filteredData() %>%
ggvis(x = xvar, y = yvar) %>%
layer_points(size.hover := 200,
fillOpacity:= 0.5, fillOpacity.hover := 1,
prop("fill", fillvar),
prop("shape", shapevar),
key := ~Shot_ID
) %>%
# Adds the previously defined tool_tip my_tooltip
add_tooltip(my_tooltip, "hover") %>%
# Specifies the size of the plot
set_options(width = 800, height = 450, duration = 0)
})
#Actually plots the data
vis %>% bind_shiny("plot1")