Я добавляю кнопку «Удалить» в таблицу для удаления строки. Он работает в блестящем приложении, но не в блестящем модуле. Я почти уверен, что это проблема с пространством имен, где-то в функции блестящей передачи или функции 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")
}
)
Если эта кнопка «Удалить» работает, она должна удалить строку и изображение на главной панели.