2016-07-01 71 views
0

我正在使用ggvis,並在UI側有一個selectInput的下面的代碼,允許用戶選擇哪個變量指示填充和形狀(inputId分別是填充和形狀)。我希望情節能夠有一個恆定的填充或形狀,如果用戶選擇。這段代碼的其他部分的工作正是我想要的,但是當我選擇的if語句的選項與以下錯誤應用程序崩潰:用戶指定的填充

Error in eval: could not find function ":=" 

我知道我有語法正確的,因爲如果我壓抑着傳說和if/else語句並將填充指定爲常量(fill:=「black」),它的工作原理就是我想要的。

任何幫助,將不勝感激。

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

如果你可以提取ggvis語句之前的if/else邏輯爲兩個變量,那麼它應該工作。 –

+0

@warmoverflow這沒有奏效。如果我在ggvis之外放置if else語句,當選擇常量選項時,它仍會給出相同的錯誤。 – User247365

+0

你可以在ggvis之外嘗試你的邏輯,並且在使用'prop'之前。根據你的邏輯做一個變量,它是映射變量'as.name(input $ fill)'或''black「'。將這個新變量傳遞給'layer_points'內的'prop',例如'prop(「fill」,newvar)'並且避免':='全部一起。 – aosmith

回答

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 
    } 

}) 
+0

完美運作!謝謝 – User247365

0

現在的代碼與來自@aosmith的輸入功能,因爲我希望它是如果圖例被壓制。但是,當我這樣做時,填充和形狀的圖例重疊,因爲這個帖子地址。

legends on ggvis graph are overlaping when using tooltip

該解決方法是在圖例中,這使得如果選擇了恆定的數據可視化選項的情節消失添加。我會發佈一個新問題來嘗試解決此問題。

更新:下面的答案解決了原始問題,但@ aosmith的答案修正了第一個問題後出現的第二個問題。

我的代碼與更正的原始問題,但包含一個重疊的圖例(糾正與@ aosmith的答案)如下。

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