向闪亮的数据表添加文本注释

时间:2019-06-08 04:10:13

标签: r shiny

我正在尝试创建一个闪亮的应用程序,使用户能够在表中添加文本注释。

我创建了一个包含3列的数据框:numidval。我希望我的闪亮应用程序执行以下操作:

  1. 从id列中选择一个值(selectInput)。
  2. 在文本框中添加文本注释(textInput)
  3. 点击操作按钮
  4. 在数据表中创建了一个名为comment的新列,将文本注释添加到id等于所选值的行的注释列中。

下面是我闪亮的应用代码。当我从selectinput中选择一个值时,在文本框中添加一些注释,然后单击“添加注释”按钮,我闪亮的应用程序窗口会自动关闭。

有人知道为什么会这样吗?

非常感谢!

    library(shiny)
    library(DT)
    df = data.frame(num=1:10, id=LETTERS[1:10], val=rnorm(10)) 
    ui = fluidPage(
        fluidRow(
            column(2, selectInput(inputId = 'selectID',
                                  label = 'Select ID2',
                                  choices = LETTERS[1:10],
                                  selected='',
                                  multiple=TRUE)),
            column(6, textInput(inputId = 'comment', 
                                label ='Please add comment in the text box:', 
                                value = "", width = NULL,
                                placeholder = NULL)),
            column(2, actionButton(inputId = "button", 
                                   label = "Add Comment"))
        ),
        fluidRow (
            column(12, DT::dataTableOutput('data') ) 
        )           
    )

    server <- function(input, output, session) {

        observeEvent(input$button, {
            df[id==input$selectID, 'Comment']=input$comment
        })

        output$data <- DT::renderDataTable({
            DT::datatable(df, 
                          options = list(orderClasses = TRUE,
                          lengthMenu = c(5, 10, 20), pageLength = 5))
        })


    }

    shinyApp(ui=ui, server=server)

1 个答案:

答案 0 :(得分:1)

  1. id不被识别为df中data.frame df[id == input$selectId, "Comment]的列,将id替换为df$id可修复错误。

  2. 为了在更新df之后重新呈现数据表,df应该是一个反应对象。

  3. 要处理selectInput id中多个选定的selectId,您可能希望将df$id == input$selectId替换为df$id %in% input$selectId

此更新的服务器功能应帮助您解决以下问题:

server <- function(input, output, session) {

  ## make df reactive
  df_current <- reactiveVal(df)

  observeEvent(input$button, {

      req(df_current())

      ## update df by adding comments
      df_new <- df_current()
      df_new[df_current()$id %in% input$selectID, "Comment"] <- input$comment

      df_current(df_new)

  })

  output$data <- DT::renderDataTable({

      req(df_current())

      DT::datatable(df_current(), 
          options = list(orderClasses = TRUE,
              lengthMenu = c(5, 10, 20), pageLength = 5))
  })

}