闪亮的模块名称空间问题:数据表中的操作按钮

时间:2019-05-27 15:03:14

标签: datatable namespaces shinymodules

我要在数据表中添加“删除”按钮以删除行。它可以在闪亮的应用程序中工作,但不能在闪亮的模块中工作。我很确定这是一个命名空间问题,在ShinyInput函数或getRemoveButton函数中的某个位置,但是我现在不知道如何解决它。

library(DT)
library(dplyr)
library(purrr)
library(shiny)

getRemoveButton <- function(name, idS = "", lab = "Pit") {
  if (stringr::str_length(idS) > 0) idS <- paste0(idS, "-")
  ret <- shinyInput(actionButton, name,
                    'button_', label = "Remove",
                    onclick = sprintf('Shiny.onInputChange(\"%sremove_button_%s\",  this.id)' ,idS, lab))
  return(ret)
}


shinyInput <- function(FUN, name, id, ses, ...) {
  n <- length(name)
  inputs <- character(n)
  for (i in seq_len(n)) {
    inputs[i] <- as.character(FUN(paste0(id, i), ...))
  }
  inputs
}



uploadFigUI <- function(id) {

  ns <- NS(id)

  tagList(
    fluidPage(
      titlePanel("Uploading Files"),
      sidebarLayout(
        sidebarPanel(
          fileInput(inputId = ns('files'), 
                    label = 'Select an Image',
                    multiple = TRUE,
                    accept=c('image/png', 'image/jpeg')), 
          DT::dataTableOutput(ns("myTable"))
        ),
        mainPanel(
          uiOutput(ns('images'))
        )
      )
    )
  )
}

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

  ns <- session$ns

  files <- eventReactive(input$files, {
    req(input$files)
    files <- input$files
    files$datapath <- gsub("\\\\", "/", files$datapath)
    files
  })


  values <- reactiveValues()

  observeEvent(files(), {

    if(is.null(values$tab)){
      values$tab <- files() %>%
        mutate(Remove = getRemoveButton(files()$name, idS = "", lab = "Tab1"))

    }else{
      tab <- files() %>%
        mutate(Remove = getRemoveButton(files()$name, idS = "", lab = "Tab1"))
      myTable <- bind_rows(values$tab,tab)
      replaceData(proxyTable, myTable, resetPaging = FALSE)
      values$tab <- myTable
    }

  })



  output$images <- renderUI({
    req(values$tab$datapath)
    image_output_list <- 
      lapply(1:nrow(values$tab),
             function(i)
             {
               imagename = ns(paste0("image", i))
               uiOutput(imagename)
             })

    do.call(tagList, image_output_list)
  })

  observe({

    req(values$tab$datapath)
    for (i in 1:nrow(values$tab))
    {
      print(i)
      local({
        my_i <- i
        imagename = paste0("image", my_i)
        img <- knitr::image_uri(values$tab$datapath[my_i])
        values$img[[i]] <- img
        output[[imagename]] <- renderUI({
          req(values$img[[i]])

          tags$img(src = img, width = "100%", height= "auto")


        })
      })
    }
  })

  proxyTable <- DT::dataTableProxy("tab")

  output$myTable <- DT::renderDataTable({
    req(values$tab)
    DT::datatable(values$tab %>%
                    select(-datapath),
                  options = list(pageLength = 25,
                                 dom        = "rt"),
                  rownames = FALSE,
                  escape   = FALSE,
                  editable = FALSE)
  })



  observeEvent(input$remove_button_Tab1, {
    myTable <- values$tab
    values$what <- str_replace(input$remove_button_Tab1, "button_", "")
    s <-  str_replace(input$remove_button_Tab1, "button_", "") %>% as.numeric()
    myTable <- myTable[-s, ]
    replaceData(proxyTable, myTable, resetPaging = FALSE)
    values$tab <- myTable
  })


}

shinyApp(
  ui = fluidPage(
    uploadFigUI("test")
  ),

  server = function(input, output) {

    suppfigure <- callModule(uploadFig, "test")

  }
)

如果此“删除”按钮有效,则应删除主面板上的行和图片。

1 个答案:

答案 0 :(得分:0)

第一个问题:代理服务器应为proxyTable <- DT::dataTableProxy("myTable")

第二个问题:您必须在删除按钮的ID前面加上名称空间:

getRemoveButton(files()$name, idS = "test", lab = "Tab1")

这是这样的。