Кнопка действия Shiny R управляет реактивными элементами

Не уверен, что мне следует использовать этот термин. По сути, у меня есть реактивная функция, которая отображает загруженный пользователем CSV-файл, и я хотел бы использовать action button для запуска процесса генерации графика. В этот момент сюжет всегда генерируется на лету. Поэтому мне интересно, в функции renderPlot, как позволить элементу action button переопределить элемент reactive. Спасибо!

ui.R

library(shiny)

shinyUI(fluidPage(
  titlePanel("Test"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv', 
                         'text/comma-separated-values,text/plain', 
                         '.csv')),
      
      checkboxGroupInput('show_vars', 'Columns to show:',
                         choices=c("Col1"="Col1", "Col2"="Col2", "Col3"="Col3"), 
                         c("Col1"="Col1", "Col2"="Col2", "Col3"="Col3")),
      
      uiOutput("study"),
      actionButton("go", "Draw the plot")
    ),
    mainPanel(
      dataTableOutput('contents'),
      plotOutput("Plot", width = 800, height = 800)
      
    )
  )
))

сервер.R

shinyServer(function(input, output) {
  
  dataInput <- reactive({
    inFile <- input$file1
    if (is.null(inFile)) return(NULL)
    data_load<-subset(read.csv(inFile$datapath, header=T, sep=",", quote='"', stringsAsFactors=FALSE), select=input$show_vars)
    data_study<-unique(data_load$Col2)
    return (list("data_load"=data_load, "data_study"=data_study))
  })
 
  study <- reactive({
    all_citation<-dataInput()$data_load$Col2
    study_choose<-unlist(lapply(input$columns,  function(x) which(all_citation==x)))
    return (list("study_choose"=study_choose))
  })

  ##Generate the data table####
  output$contents <- renderDataTable({
    study_choose_temp<-study()$study_choose
    dataInput()$data_load[study_choose_temp,]
  })
  
  ###I would like the actionButton controls reactive elements 
  ###dataInput()$data_load$Col3[study()$study_choose]

  output$Plot <- renderPlot({
    input$go
    hist(dataInput()$data_load$Col3[study()$study_choose])
  })
  
  output$study <- renderUI({
    # If missing input, return to avoid error later in function
    if(is.null(dataInput()$data_study)) return()
    # Create the checkboxes and select them all by default
    checkboxGroupInput("columns", "Choose studies to plot", 
                       choices  = dataInput()$data_study,
                       selected = dataInput()$data_study)
    
  })
})

###шаблон CSV


person TTT    schedule 12.11.2014    source источник


Ответы (1)


Используйте isolate в renderPlot(), чтобы он обновлялся только при нажатии кнопки input$go. Если вы сделаете это, график не будет перерисовываться при изменении других реактивных элементов, но input$go находится за пределами isolate, поэтому график будет перерисовываться.

 output$Plot <- renderPlot({
    input$go
    isolate( 
        hist(dataInput()$data_load$Col3[study()$study_choose]) 
    )
  })
person John Paul    schedule 12.11.2014