两个Reactives R Shiny

时间:2017-04-07 04:18:38

标签: r shiny

我需要根据用户输入呈现一个表,这将是两个可能的表之一。我已经通过用户选择要上载的.csv文件来定义第一个表filedata。第二个表data_ranked_words具有相同的维度。

我想要的是输出在两个表之间切换。我在reactive()中定义了每个表。但是,我知道data_ranked_words被动不会被触发。当用户上传文件时,如何触发这些反应?在我的代码中,问题在于reactive()开头的两个server.R语句。

library(shiny)
library(markdown)
library(DT)
library(D3TableFilter)
options(shiny.maxRequestSize=50*1024^2) 

setwd('~/Desktop/DSI/Topic Model App Interface')

# ui.R
#-------------------------------------------------------------------------------------
ui <- shinyUI(
  navbarPage("Start",
     tabPanel("From Data",
        sidebarLayout(
          sidebarPanel(
            radioButtons("plotType", "Plot type",
                         c("Scatter"="p", "Line"="l")
            )
          ),
          mainPanel(
            plotOutput("plot")
          )
        )
     ),
     tabPanel("From CSV",
              sidebarLayout(
                sidebarPanel(
                  # Define what's in the sidebar
                  fileInput("file",
                            "Choose CSV files from directory",
                            multiple = TRUE,
                            accept=c('text/csv', 
                                     'text/comma-separated-values,text/plain', 
                                     '.csv')),
                  h5(div(HTML('Use the radio butons to toggle between the <em>Word View</em> and
                              <em>Probability View</em>.'))),
                  radioButtons('toggle', 'Choose one:', list('Word View', 'Probability View')),
                  p(div(HTML('<strong>Note:</strong> The <em>Probability View</em> will
                             <u>not</u> yield the top X number of words. It will instead
                             return the first X columns. You can then sort each column in
                             ascending or descending order. Keep in mind that it will only 
                             sort from the rows that are displayed, <u>not</u> all rows.'))),
                  br(),
                  sliderInput('slider', div(HTML('How many rows to display?')), 1, 100, 20),
                  br(),
                  h5('Use the buttons below to quickly show large numbers of rows.'),
                  radioButtons('rowIdentifier', 'Show more rows:',
                               list('[ Clear ]', '200', '500', '1000', '5000', '10000', 'All Rows')),
                  p(div(HTML('<strong>Warning:</strong> Printing all rows to the screen may
                             take a while.'))),
                  h3('Tips:'),
                  p("You can copy and paste the table into Excel. If you only want to 
                    copy one column, use the 'Show/Hide' function at the top-right of the table 
                    to hide all the undesired columns."),
                  p(div(HTML('Sorting by column is available in <em>Probability View</em> but 
                             not <em>Word View</em>.')))

                  ),

                # Define what's in the main panel
                mainPanel(
                  title = 'Topic Model Viewer',
                  # How wide the main table will be
                  fluidRow(
                    column(width = 12, d3tfOutput('data'))
                  )
                )
                  )
     ),
     navbarMenu("More",
        tabPanel("temp"

        ),
        tabPanel("About",
           fluidRow(
             column(6
             ),
             column(3
             )
           )
        )
     )
  )
)


# server.R
#-------------------------------------------------------------------------------------
server <- shinyServer(function(input, output, session) {
  # Set up the dataframe for display in the table
  # Define 'filedata' as the .csv file that is uploaded
  filedata <- reactive({
    infile <- input$file
    if (is.null(infile)) {
      # User has not uploaded a file yet
      return(NULL)
    }
    temp = read.csv(infile$datapath)

    # Save data as RDS file, which is much faster than csv
    saveRDS(temp, file = 'data.rds')

    # Read in data file
    data = readRDS('data.rds')

    # Transpose data for more intuitive viewing. Words as rows, topics as cols
    data = t(data)

    # Convert to data frame
    data = as.data.frame(data)

    # Return this
    data
  })

  # The ranked and ordered csv file
  data_ranked_words <- reactive({
    data = filedata()

    # Sort each column by probability, and substitute the correct word into that column
    # This will essentially rank each word for each topic
    # This is done by indexing the row names by the order of each column
    temp = matrix(row.names(data)[apply(-data, 2, order)], nrow(data))
    temp = as.data.frame(temp)

    # Define column names (same as before) for the new data frame
    colnames(temp) = paste0(rep('topic', ncol(data)), 1:ncol(data))

    # Return this
    temp

    print('Success')
  })

  output$data <- renderD3tf({
    # Define table properties. See http://tablefilter.free.fr/doc.php
    # for a complete reference
    tableProps <- list(
      rows_counter = TRUE,
      rows_counter_text = "Rows: ",
      alternate_rows = TRUE
    );

    # Radio buttons
    # The reason why the extensions are in this if() is so that sorting can be
    # activated on Probability View, but not Word View
    if(input$toggle=='Word View'){
      df = data_ranked_words
      extensions <-  list(
        list( name = "colsVisibility",
              text = 'Hide columns: ',
              enable_tick_all =  TRUE
        ),
        list( name = "filtersVisibility",
              visible_at_start =  FALSE)
      )
    } else if(input$toggle=='Probability View'){
      df = filedata()
      extensions <-  list(
        list(name = "sort"),  #this enables/disables sorting
        list( name = "colsVisibility",
              text = 'Hide columns: ',
              enable_tick_all =  TRUE
        ),
        list( name = "filtersVisibility",
              visible_at_start =  FALSE)
      )
    }

    # Radio button options for more row viewing options
    if(input$rowIdentifier=='Clear'){
      num_rows = input$slider
    } else if(input$rowIdentifier==200){
      num_rows = 200
    } else if(input$rowIdentifier==500){
      num_rows = 500
    } else if(input$rowIdentifier==1000){
      num_rows = 1000
    } else if(input$rowIdentifier==5000){
      num_rows = 5000
    } else if(input$rowIdentifier==10000){
      num_rows = 10000
    } else if(input$rowIdentifier=='All Rows'){
      num_rows = nrow(df)
    } else{
      num_rows = input$slider
    }

    # Create table
    if(is.null(filedata())){
    } else{
      d3tf(df,
           tableProps = tableProps,
           extensions = extensions,
           showRowNames = TRUE,
           tableStyle = "table table-bordered")
    }
  })

  # This line will end the R session when the Shiny app is closed
  session$onSessionEnded(stopApp)
})

# Run app in browser
runApp(list(ui=ui,server=server), launch.browser = TRUE)

0 个答案:

没有答案