navbar Page and wrong update of ggvis plot Shiny

一笑奈何 提交于 2019-12-13 07:28:42

问题


Hi
I just create Shiny app. But there is a little problem when I want to present my Shiny app in navbarPage way. I mean, when I add new navbarPage named Introduction everithing works fine with plot till... I come back to Introduction navbarPage and then one again come back to Plot navbarPage, plot does not work well. What happended? How to fix it?

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:


I've never had much luck putting ggvis inside of a reactive. Weird things happen like what you experienced. Try this.

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

You have to assign the y value in the data_two reactive, then run the ggvis outside of the reactive().



来源:https://stackoverflow.com/questions/28474903/navbar-page-and-wrong-update-of-ggvis-plot-shiny

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!