我正在构建一个R Shiny应用程序,我可以在其中动态添加UI,每个UI都有自己的按钮来删除UI. 每个按钮都有自己的名称,模式为"删除[数字]",如delete1、delete2、delete34等,编号对应于添加的UI—Widget1、Widget2、Widget34等.
我试图观察操作按钮何时被按下,以便删除相应的小部件.
here.我遵循这个答案.
我遇到的问题是如何访问被按下按钮的ID.
以下是我当前的代码:
library(shinydashboard)
library(shiny)
library(shinyjs)
library(shinyjqui)
library(gridstackeR)
library(plotly)
#2b3940
ui <- fluidPage (
useShinyjs(),
tags$head(
tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/gridstack.js/10.0.1/gridstack-all.min.js", type='module'),
tags$script(HTML('
let numFirstWidgets = 0;
function addFirstWidget() {
var grid = document.querySelector(\'.grid-stack\').gridstack;
let ids = "widget" + numFirstWidgets;
grid.addWidget(`<div class="grid-stack-item"><div class="grid-stack-item-content" id=${ids}></div></div>`, {h:3, w: 2});
numFirstWidgets += 1;
}
'))
),
grid_stack(id="mygrid"),
actionButton("first_widget", "First Widget"),
# plotlyOutput("plot"),
title = "Gridstack Prototype"
)
server <- function(input, output, session) {
numOfWidgets <- 0
observeEvent(input$first_widget, {
# browser()
runjs("addFirstWidget();")
insertUI(
paste0("#widget", numOfWidgets),
where = "afterBegin",
tagList(
actionButton(paste0("delete", numOfWidgets), "Delete This Panel"),
plotlyOutput(paste0("plotly", numOfWidgets), height="100%")
),
output[[paste0("plotly", numOfWidgets)]] <- renderPlotly({
plot_ly(data = iris, x = ~Sepal.Length, y = ~Petal.Length)
})
)
numOfWidgets <<- numOfWidgets + 1
})
observeEvent(
lapply(
names(input)[grep("delete[0-9]+",names(input))],
function(name){
input[[name]]
}
),
{
removeUI(paste("widget", gsub("[^0-9]", "", name)))
}
)
}
shinyApp(ui = ui, server = server)
但是,这并不起作用,因为它给了我一个错误:
Warning: Error in is.factor: object 'name' not found
如何获取输入的特定名称,以便使用它删除相应的UI?可以有无限数量的行动.