Shiny R - 反应性不适用于条件面板

时间:2015-10-17 22:01:42

标签: r shiny

问题:

在我的应用中,我在侧面板中有两个标签 统计资料和图表 - 在统计数据中,我想根据在主面板中选择的数据(选择输入选择数据)和selectGroupinput(选择所选数据的列)来显示数据框和一些描述性统计(工作正常),

图表中的

我有一个所选数据列的下拉列表,并希望显示它们的条形图。

现在,当我没有将selectgroupinput的条件面板仅显示在Stat选项卡中并且仅在Chart选项卡中下拉selectinput时(这意味着在选择数据时列自动更新),这可以顺利运行。

现在当我把条件面板放在那里时,它对于Stat选项卡运行顺畅,但在Charts选项卡中,Columns在更改数据集时无法正常工作。

我必须单击Stat选项卡并再次单击返回Charts选项卡以使数据的实际列显示在下拉列表中 - 简而言之,数据集的反应性和列下拉列表不能正常运行,因为它应该是

我在这里有一个可重现的代码示例:

https://gist.github.com/creepystranger/9168c1430c7d468fc5fb

代码: server.r

ibrary(shiny)
#library(RODBC)
library(ggplot2)
#library(shinyjs)
#stat_helper_function to be used in rendering stat table 

summary <- function(x) {
  funs <- c(mean, median, sd, mad, IQR,max,min)
  lapply(funs, function(f) f(x, na.rm = TRUE))
}

make_stat <- function(data){
  numeric_columns <- sapply(data,is.numeric)
  stat_table <- sapply(data[,numeric_columns],summary)
  rows <- c("Mean","Median","SD","MAD","IQR","Max","Min")
  df <- data.frame(stat_table,row.names = rows)
}
#sample prototypeof Data
data_sets <- c("iris","diamonds")

shinyServer(function(input, output) {

  output$choose_dataset <- renderUI({
    selectInput("Dataset",label = "choose a dataset",as.list(data_sets))

  })

  output$choose_columns <- renderUI({

    if(is.null(input$Dataset))
      return()


    dat <<- get(input$Dataset) # make it globally accessable _saves the pain of multiple load of the data  
    colnames <- names(dat)


   checkboxGroupInput("columns", "Choose columns", 
                       choices  = colnames,
                       selected = colnames)
    })

  output$plot_control <- renderUI({

    if(is.null(input$Dataset))
      return()
    dat #<- get(input$Dataset)
    numeric_columns <- sapply(dat,is.numeric)
    num_dat <- dat[,numeric_columns]
    colnames <- names(num_dat)

    selectInput("selectize","For the X axis and Y axis",choices=colnames)

   }) 

  output$histo_gram <- renderPlot({

    if(is.null(input$Dataset))
      return()
    #z<- matrix(num_dat,ncol = ncol(num_dat)) 
    numeric_columns <- sapply(dat,is.numeric)
    num_dat <- dat[,numeric_columns]

    num_dat

    if (is.null(input$selectize) || !(input$selectize %in% names(num_dat)))
      return()

    z <- num_dat[,input$selectize]
   # bw <- diff(range(z)) / (2 * IQR(z) / length(z)^(1/3))

    qplot(z,geom ="histogram")

  }) 



  output$mytable1 <- renderDataTable({

    if(is.null(input$Dataset))
      return()


    #dat <- get(input$Dataset)
     dat

    if (is.null(input$columns) || !(input$columns %in% names(dat)))
      return()

    # Keep the selected columns
    dat <- dat[, input$columns, drop = FALSE]
    dat},  options=list(lengthMenu = c(5, 8, 10), pageLength = 5)
  ) 

  output$stat_table <- renderTable({

    dat #<- get(input$Dataset)
    num_dat <- dat[,input$columns,drop=FALSE]
    make_stat(num_dat)
      }

  )
  })

ui.r

# This is the user-interface definition of a Shiny web application.
# You can find out more about building applications with Shiny here:
# 
# http://www.rstudio.com/shiny/
#

library(shiny)
library(ggplot2)

shinyUI (pageWithSidebar( 


headerPanel("Creepy-Stats"),
sidebarPanel(

      uiOutput("choose_dataset"),
      br(),
      conditionalPanel(
        condition ="input.conditionedPanels == 'Stats'",uiOutput("choose_columns")),
        conditionalPanel(condition ="input.conditionedPanels == 'Charts'" ,uiOutput("plot_control")), width = 2
#     
# uiOutput("choose_columns"),uiOutput("plot_control"),width = 2

  ),


  mainPanel(
    tabsetPanel(
      tabPanel("Stats", 


        div (class='row',
             div(dataTableOutput("mytable1"),class="span10"),

             div(tableOutput("stat_table"),class="span5")

        ),id = "conditionedPanels"
      )


      ,

      tabPanel("Charts",

        div(class='row', 
            div(plotOutput("histo_gram"),class="span10"))       
               ),id = "conditionedPanels"

    ),width = 10
  )
))

0 个答案:

没有答案