2015-02-12 2 views
0

Hi
Я просто создаю Блестящее приложение. Но есть небольшая проблема, когда я хочу представить мое приложение Shiny в формате navbarPage. Я имею в виду, когда я добавляю новый navbarPage с именем Introduction, который работает отлично с сюжетом до ... Я возвращаюсь к введению navbarPage, а затем снова возвращаюсь на Участок navbarPage, сюжет не работает. Что случилось? Как это исправить?
navbar Страница и неправильное обновление ggvis plot Shiny

ui.R

library(dplyr) 
library(shiny) 
library(ggvis) 

shinyUI(
    navbarPage("", 
      tabPanel("Introduction", 
         fluidRow(
         column(3, 
           wellPanel(
           ) 

         ), 

         column(9, 
           br(),br(),br(), 
           h5("This screen will soon display a brief introduction to the project.") 
         ) 
        ) 
      ),  
      tabPanel("Plot", 
         fluidRow(
         column(3, 
          radioButtons("dataset", label = h4("Choose dataframe"), 
             choices = list("Item" = "df1", "Task" = "df2")), 
          selectInput("yvar", "Y-axis variable", axis_vars_y, selected = "number"), 
          uiOutput("slider") 

         ), 
        column(9, 
          ggvisOutput("plot") 
     ) 
    ) 
) 
) 
) 

server.R

library(shiny) 
library(dplyr) 
library(magrittr) 
library(lazyeval) 

shinyServer(function(input, output) { 

    datasetInput <- reactive({ 
    switch(input$dataset, 
      df1 = df1, 
      df2 = df2) 
    }) 

    axis_vara_y <- reactive({ 
    switch(input$yvar, 
      number = 2, 
      number2 = 3) 
    }) 

    output$slider <- renderUI({ 
     sliderInput("inslider","Slider", min = round(min(datasetInput()[,axis_vara_y()]),0)-1, 
             max = round(max(datasetInput()[,axis_vara_y()]),0)+1, 
             value = c(round(min(datasetInput()[,axis_vara_y()]),0)-1, 
               round(max(datasetInput()[,axis_vara_y()]),0)+1), 
             step = 0.5) 
}) 

data <- reactive({ 
    filteredData <- datasetInput() 
    axisData <- axis_vara_y() 

    if(!is.null(input$inslider)){ 
    filteredData <- filteredData %>% 
     filter(filteredData[,axisData] >= input$inslider[1], 
      filteredData[,axisData] <= input$inslider[2]) 
    } 

    if (nrow(filteredData) == 0){ 
    return (datasetInput()) 
    }else{ 
    return(filteredData) 
    } 
}) 
    data_two <- reactive({ 
    data() %>% 
     mutate(id = 1:n()) 

    }) 

    vis <- reactive({ 

    yvar_name <- names(axis_vars_y)[axis_vars_y == input$yvar] 
    yvar <- prop("y", as.symbol(input$yvar)) 

    data_two %>% 
     ggvis(x = ~name, y = yvar) %>%  
     layer_points(size := 120, 
       fill = ~name, 
       fillOpacity := 0.6) 

    }) 
    vis %>% bind_shiny("plot") 
}) 

global.R

df1_number <-sample(seq(1,20,0.01),20,replace = T) 
df2_number <-sample(seq(1,20,0.01),20,replace = T) 
df1_number2 <-sample(seq(1,5,0.01),20,replace = T) 
df2_number2 <-sample(seq(1,5,0.01),20,replace = T) 

df1 <- data.frame(name = rep(letters[1:4],each = 5), number = df1_number, number2 = df1_number2) 
df2 <- data.frame(name = rep(letters[1:4],each = 5), number = df2_number, number2 = df2_number2) 
axis_vars_y <- c("number" = "number", "number2" = "number2") 

ответ

1

Мне никогда не удавалось нанести ggvis внутри реактивного. Странные вещи случаются так, как вы пережили. Попробуйте this.

shiny::runGist("https://gist.github.com/corynissen/9cdf1275f394e7945eb6") 

Вы должны присвоить значение у в data_two реактивным, а затем запустить ggvis вне реактивная().

+0

Вы правильно назначили значение y для data_two, но вы все равно можете сделать ggvis реактивным. Он отлично работает, когда вы добавляете значение y, как вы демонстрируете. Разница заключается в том, хотите ли вы только ретранслировать данные или другие аспекты (например, заголовок). См. [Этот вопрос] (http://stackoverflow.com/questions/25011544/how-is-data-passed-from-reactive-shiny-expression-to-ggvis-plot/25060999#25060999) для хорошего объяснения между реактивными или нереактивных объектов ggvis. – cdeterman

+0

@ cdeterman @cory ОК, спасибо, но это решение частично решает проблему. Я имею в виду попробовать этот сценарий: 'Введение Panel' ->' Plot Panel' -> изменить на Task 'dataframe' -> изменить' Y-axis variable' на 'number2' -> вернуться к' Введение Panel' -> перейти к 'Plot Panel' еще раз -> измените' переменную оси Y' на 'number'. В результате, график теряет все точки точки 'a' и' b' и отображает только некоторые точки точки 'c' и' d'. Можно ли улучшить его? – Nicolabo

+0

Повторите попытку. Я использовал совет @ cdeterman и попробовал ggvis внутри реактивного. Это немного неуклюже в браузере (перезагружает весь сюжет при изменении yvar), но точки не случайно исчезают. Я заменяю data_two() и ggvis на один реактивный для данных и график – cory