编辑:数据表中的已编辑的值不作为选择中的selectInput()传递

时间:2018-07-12 14:28:23

标签: r shiny dt

我有一个简单的闪亮应用程序:

#ui.r
navbarPage(
  "Application",
  tabPanel("General",
           sidebarLayout(

             sidebarPanel(
               uiOutput("tex2"),
               uiOutput("book3")
             ),
             mainPanel(
               DT::dataTableOutput("hot3")

             )
           )))
#server.r
  library(shiny)
library(DT)
server <- function(input, output,session) {
  output$tex2<-renderUI({
    numericInput("text2","#tests",
                 value = 1,
                 min=1
    )
  })

  output$book3<-renderUI({

    selectInput("bk3", 
              "Change Name", 
              choices=(rt1()[,1]))
  })

  rt1<-reactive({
    data.frame(
      Label=paste("Test",1:input$text2),
      stringsAsFactors = FALSE)
  })

  output$hot3 <-DT::renderDataTable(

    rt1(),
    editable = TRUE

  )

}

如您所见,我有一个可编辑的数据表,并将其标签值传递给selectInput()“更改名称”。问题是,当我在数据表中编辑标签时,selectInput()中的值不会相应更改。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您想做什么,那么我认为DT无法做到这一点。

这可以通过the D3TableFilter package进行(到目前为止仅在Github上可用)。请运行以下代码,如果确实要执行此操作,请告诉我:

library(shiny)
library(htmlwidgets)
library(D3TableFilter) # devtools::install_github("ThomasSiegmund/D3TableFilter")

ui <- navbarPage(
  "Application",
  tabPanel("General",
           sidebarLayout(
             sidebarPanel(
               uiOutput("tex2"),
               uiOutput("book3")
             ),
             mainPanel(
               d3tfOutput("hot3")
             )
           )
  )
)

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

  output$tex2<-renderUI({
    numericInput("text2", "#tests", value = 1, min=1)
  })

  rt1 <- reactiveVal(
    data.frame(
      Label = "Test 1",
      stringsAsFactors = FALSE)
  )

  observe({
    if(is.null(input$text2)) return(NULL)
    rt1(
      data.frame(
        Label = paste("Test", 1:input$text2),
        stringsAsFactors = FALSE)
    )
  })

  output$book3 <- renderUI({
    selectInput("bk3", "Change Name", choices=rt1()[,1])
  })

  output$hot3 <- renderD3tf({
    # Define table properties. See http://tablefilter.free.fr/doc.php for a complete reference
    tableProps <- list(
      btn_reset = TRUE,
      col_types = c("string", "string") # alphabetic sorting for the row names column
    )

    d3tf(rt1(),
         tableProps = tableProps,
         extensions = list(
           list(name = "sort")
         ),
         showRowNames = TRUE,
         tableStyle = "table table-bordered", 
         edit = TRUE)
  })

  observe({
    if(is.null(input$hot3_edit)) return(NULL);
    edit <- input$hot3_edit;

    isolate({
      # need isolate, otherwise this observer would run twice for each edit
      row <- as.integer(edit$row);
      val <- edit$val;
      dat <- rt1()
      dat[,"Label"][row] <- val
      rt1(dat)
    })
  })

}

shinyApp(ui, server)

答案 1 :(得分:1)

使用DT来调整Stéphane Laurent的答案会得出以下结论:

library(shiny)
library(DT)

ui <- navbarPage(
  "Application",
  tabPanel("General",
            sidebarLayout(
             sidebarPanel(
               uiOutput("tex2"),
               uiOutput("book3")
             ),
             mainPanel(
               DTOutput("hot3")
             )
           )
  )
)

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

  output$tex2<-renderUI({
    numericInput("text2", "#tests", value = 1, min=1)
  })

   rt1 <- reactiveVal(
    data.frame(
      Label = "Test 1",
      stringsAsFactors = FALSE)
  )

  observe({
    if(is.null(input$text2)) return(NULL)
    rt1(
      data.frame(
        Label = paste("Test", 1:input$text2),
        stringsAsFactors = FALSE)
    )
  })

  output$book3 <- renderUI({
    selectInput("bk3", "Change Name", choices=rt1()[,1])
  })

  output$hot3 <- renderDT({
    datatable(rt1(), editable = TRUE)
  })

  observe({
    if(is.null(input$hot3_cell_edit)) return(NULL);
    edit <- input$hot3_cell_edit;

    isolate({
      # need isolate, otherwise this observer would run twice for each edit
      row <- as.integer(edit$row);
      val <- edit$value;
      dat <- rt1()
      dat[,"Label"][row] <- val
      rt1(dat)
    })
  })

}

shinyApp(ui, server)