【问题标题】:Subsetting dataframe based on dynamically generated checkBoxGroupInput: checkbox keeps resetting基于动态生成的checkBoxGroupInput子集数据框:复选框不断重置
【发布时间】:2019-10-31 08:16:35
【问题描述】:

我想使用 Shiny 应用程序加载文件(制表符分隔),在加载文件后(使用 observeEvent)使用列标题动态创建一个checkboxGroupInput,然后对数据框进行子集化来自基于选定复选框的文件。然后使用我现在无法共享的代码绘制数据。

除了最后一点:根据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)

谢谢大家

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我认为有几件事可能会有所帮助...

    一,您可以将您的 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")
       })
      }) 
    
    }
    

    【讨论】:

    • 这很好用,谢谢。我想我理解你在那里所做的事情的逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2015-01-24
    • 2011-12-21
    相关资源
    最近更新 更多