我正在构建一个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?可以有无限数量的行动.

推荐答案

你不需要在这里使用removeUIobserveEvent,它更简单:当你创建actionButton用于删除时,传递一个onclick参数来删除相关的widget:

actionButton(
  paste0("delete", numOfWidgets),
  "Delete This Panel",
  onclick = paste0(
    "var $ToDelete = $('#widget",
    numOfWidgets,
    "'); setTimeout(function(){$ToDelete.remove();},0);"
  )
)

enter image description here

R相关问答推荐

从具有随机模式的字符串中提取值

在(g)子中使用asserable字符

在R中创建一个包含转换和转换之间的时间的列

如何得到R中唯一的组合群?

使用geom_segment()对y轴排序

如何在一次运行中使用count进行多列计数

在ggplot中为不同几何体使用不同的 colored颜色 比例

一小时满足条件的日期的 Select

提取第一个下划线和最后一个下划线之间的任何内容,例外情况除外

将多列合并为单独的名称—值对

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

根据类别合并(汇总)某些行

如何根据数据帧中的值从该数据帧中提取值?

以字符格式导入的ExcelElectron 表格日期列标题

跨列查找多个时间报告

将多个列合并为一个列的有效方法是什么?

计算多变量的加权和

使用其他DF中的文件名将列表中的每个元素保存到文件中

如何在GGPlot中控制多个图例和线型

具有某些列的唯一值的数据帧