Поднабор кадра данных на основе динамически генерируемого checkBoxGroupInput: флажок продолжает сбрасываться - PullRequest
0 голосов
/ 31 октября 2019

Я хотел бы использовать приложение Shiny для загрузки файла (разделенного табуляцией), динамически создать checkboxGroupInput, после загрузки файла (используя observeEvent) с использованием заголовков столбцов, а затем установить подкадр данныхэто происходит из файла на основе выбранных флажков. Затем данные выводятся с использованием кода, которым я сейчас не могу поделиться.

Все работает отлично, кроме последнего бита: подстановка кадра данных на основе выбранных флажков в checkboxGroupInput. Флажки все начинают выделяться, и сюжет создается нормально. Если вы отмените выбор одного из флажков, график перераспределяется соответствующим образом на доли секунды (поэтому поднабор работает нормально) , затем невыбранный флажок повторно выбирает сам себя, и график возвращается к старому графику. Это крошечная проблема, которую я пытаюсь решить, догадываясь, что это одна строка кода. Я предполагаю, что это из-за некоторой реактивности, которую я не понимаю, и флажок постоянно сбрасывается.

Вот пример:

###

## Some functions I can't share

### Shiny app
library(shiny)

# Define UI 
ui <- fluidPage(

  # Application title
  titlePanel("MagicPlotter"),

  # Sidebar  
  sidebarLayout(
    sidebarPanel(
      fileInput(inputId = "myInputID",
                label = "Your .csv file",
                placeholder = "File not uploaded"),
      uiOutput("mylist"),
      uiOutput("submitbutton")
    ),

    # Show a plot
    mainPanel(
      verticalLayout(
        plotOutput("myPlot"))
    )
  )
)

# Define server
server <- function(input, output) {

  output$myPlot <- renderPlot({



    inputfile <- input$myInputID

    if(is.null(inputfile))
    {return()}
    mydataframe <- read.table(file=inputfile$datapath, sep="\t", head=T, row.names = 1)


    mydataframecolumnnames <- colnames(mydataframe[1:(length(mydataframe)-1)])
    # the last column is dropped because it's not relevant as a column name

    observeEvent(input$myInputID, {
      output$mylist <- renderUI({
        checkboxGroupInput(inputId="mylist",
                           label="List of things to select",
                           choices=mydataframecolumnnames,
                           selected=mydataframecolumnnames)
      })
    })

    observeEvent(input$myInputID, {
      output$submitbutton <- renderUI({
        submitButton("Subset")
      })
    }) 

    mysubset <- mydataframe[input$mylist]

    myPlot(mysubset)

  })


}

# Run the application 
shinyApp(ui = ui, server = server)

Спасибо всем

1 Ответ

1 голос
/ 31 октября 2019

Я думаю, что есть несколько вещей, которые могут помочь ...

Во-первых, вы можете переместить ваши observeEvent методы за пределы вашего renderPlot.

Также вы можете создатьreactive функция для чтения в таблице данных.

Надеюсь, это поможет.

server <- function(input, output) {

  myDataFrame <- reactive({
    inputfile <- input$myInputID
    if(is.null(inputfile))
      {return()}
    read.table(file=inputfile$datapath, sep="\t", head=T, row.names = 1)
  })

  output$myPlot <- renderPlot({
    req(input$mylist)
    mysubset <- myDataFrame()[input$mylist]
    plot(mysubset)
  })

  observeEvent(input$myInputID, {
   mydata <- myDataFrame()
   mydataframecolumnnames <- colnames(mydata[1:(length(mydata)-1)])

   output$mylist <- renderUI({
     checkboxGroupInput(inputId="mylist",
                        label="List of things to select",
                        choices=mydataframecolumnnames,
                        selected=mydataframecolumnnames)
   })
  })

  observeEvent(input$myInputID, {
   output$submitbutton <- renderUI({
     submitButton("Subset")
   })
  }) 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...