2016-07-01 2 views
0

Я использую ggvis и имею следующий код с selectInput на стороне пользовательского интерфейса, позволяя пользователю выбирать, какая переменная диктует заполнение и форму (inputId - заполнение и форма соответственно). Я хочу, чтобы сюжет имел возможность иметь постоянную заливку или форму, если пользователь будет выбирать. Раздел еще этот код работает точно так же, как я хочу, но когда я выбираю опцию в если заявлении приложение падает со следующей ошибкой:Указанный пользователем заполнение

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

Если вы можете извлечь логику if/else перед операцией ggvis для двух переменных, тогда она должна работать. –

+0

@warmoverflow Это не сработало. Если я помещаю инструкции if else вне ggvis, он все равно дает ту же ошибку, когда выбран параметр constant. – User247365

+0

Вы можете попробовать свою логику вне ggvis, а также перед использованием 'prop'. Создайте переменную, которая является либо переменной отображения, как as.name (input $ fill) 'OR' "black" на основе вашей логики. Передайте эту новую переменную в 'prop' в' layer_points', например, 'prop (" fill ", newvar)' и избегайте ': =' все вместе. – aosmith

ответ

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 
    } 

}) 
+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") 
Смежные вопросы