用户指定的填充

时间:2016-07-01 22:03:03

标签: r if-statement shiny ggvis

我正在使用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")

2 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,您可以使用prop语句为if创建变量。这样,您就可以直接在:=中使用常量或变量来绕过prop的问题。

你自动获得传说。要在有两个图例(这会导致重叠)时控制展示位置,您可以为ggvis图表命名。这允许您引用向图形添加元素,以便仅在根据逻辑以及shapevarfillvar值添加第二个图例时将其向下移动。

这是反应函数的代码。

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")