如何将操作按钮引用到屏幕中插入的绘图(insertUI/removeUI)

如何将操作按钮引用到屏幕中插入的绘图(insertUI/removeUI),r,shiny,R,Shiny,我已经问过了,但没有得到帮助,所以我在这里尝试: 我正在尝试将以下功能添加到我的应用程序中:当用户插入绘图时,会出现一个删除按钮,专门删除同时插入的绘图。该应用程序基于insertUI和removeUI 这就是示例应用程序 library(shiny) library(shinydashboard) # Example data a<-(letters) b<-rnorm(length(letters), 4,2) c<-rnorm(length(letters), 10,

我已经问过了,但没有得到帮助,所以我在这里尝试:

我正在尝试将以下功能添加到我的应用程序中:当用户插入绘图时,会出现一个删除按钮,专门删除同时插入的绘图。该应用程序基于insertUI和removeUI

这就是示例应用程序

library(shiny)
library(shinydashboard)

# Example data

a<-(letters)
b<-rnorm(length(letters), 4,2)
c<-rnorm(length(letters), 10,15)
d<-c(1:10,20:30,45:49)

data<-data.frame(a,b,c,d)
names(data)<-c("name","v1","v2","v3")

# UI

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    actionButton("add", "Add"),
    radioButtons("add_elements","", c("Element1",   "Element2"))
  ),
  dashboardBody(
    fluidRow( tags$div(id="placeholder")
    )
))

# Server Logic

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

 # Initialize empty vector
  inserted<- c()

  # Observer
  observeEvent(input$add, {
    id_add <- paste0(input$add, input$add_elements)

    insertUI(selector = '#placeholder', where = "afterEnd",
             ui= switch(input$add_elements,
                        'Element1'= plotOutput(id_add),
                        'Element2' = plotOutput(id_add))
    )

    output[[id_add]] <- 
      if (input$add_elements == "Element1") 

        renderPlot({
          plot(data[,1],data[,2])

          }) else if (input$add_elements == "Element2") 

          renderPlot({
            plot(data[,1],data[,4])
            })
    inserted <<- c(id_add,inserted)
    insertUI(
      selector = "#placeholder",
      where = "afterEnd",
      ui = tags$div(actionButton("remove_button", "Remove"))
      )})

  ## Remove Elements ###
  observeEvent(input$remove_button, {
    removeUI(
      selector = paste0('#', inserted[length(inserted)])
    )
    inserted <<- inserted[-length(inserted)]
  })
}

shinyApp(ui = ui, server = server)
当用户需要比较多个图时,这不是很有用。我对使用这些选择器的理解有限,完全不知道如何为每个只删除相应绘图的绘图合并一个删除按钮。任何帮助都将不胜感激


此外,可能会有所帮助,因为它显示了类似的功能(我显然无法实现)。

在这种情况下,我总是使用带有“反应值”的“列表”,如下所示:

library(shiny)
library(shinydashboard)

# Example data

a<-(letters)
b<-rnorm(length(letters), 4,2)
c<-rnorm(length(letters), 10,15)
d<-c(1:10,20:30,45:49)

data<-data.frame(a,b,c,d)
names(data)<-c("name","v1","v2","v3")

# UI

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    actionButton("add", "Add"),
    radioButtons("add_elements","", c("Element1",   "Element2"))
  ),
  dashboardBody(
    uiOutput("myUI")
  ))

# Server Logic

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

  alld <- reactiveValues()
  alld$ui <- list()

  output$myUI <- renderUI({
    alld$ui
  })

  # Observer
  observeEvent(input$add, {
    id_add <- length(alld$ui)+1

    alld$ui[[id_add]] <-  list(
      plotOutput(paste0("plt",id_add)),
      actionButton(paste0("remove_button", id_add), "Remove")
    )


      if (input$add_elements == "Element1"){
        output[[paste0("plt",id_add)]] <- renderPlot(plot(data[,1],data[,2]))
      } else {
        output[[paste0("plt",id_add)]] <- renderPlot(plot(data[,1],data[,4]))
      }
    })



  ## Remove Elements (for all plots) ###
observe({
  lapply(seq_len(length(alld$ui)), function(i){
    id_add <- i
    observeEvent(input[[paste0("remove_button", id_add)]], {
      alld$ui[[id_add]][1] <- NULL
    })
  })

})


}

shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(shinydashboard)
#示例数据
感谢您的解决方案(很抱歉一周内没有回复您)。使用
reactiveValues
list()
确实非常好。我试图理解一些事情:
输出[[“表达式”]]到底是什么
library(shiny)
library(shinydashboard)

# Example data

a<-(letters)
b<-rnorm(length(letters), 4,2)
c<-rnorm(length(letters), 10,15)
d<-c(1:10,20:30,45:49)

data<-data.frame(a,b,c,d)
names(data)<-c("name","v1","v2","v3")

# UI

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    actionButton("add", "Add"),
    radioButtons("add_elements","", c("Element1",   "Element2"))
  ),
  dashboardBody(
    uiOutput("myUI")
  ))

# Server Logic

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

  alld <- reactiveValues()
  alld$ui <- list()

  output$myUI <- renderUI({
    alld$ui
  })

  # Observer
  observeEvent(input$add, {
    id_add <- length(alld$ui)+1

    alld$ui[[id_add]] <-  list(
      plotOutput(paste0("plt",id_add)),
      actionButton(paste0("remove_button", id_add), "Remove")
    )


      if (input$add_elements == "Element1"){
        output[[paste0("plt",id_add)]] <- renderPlot(plot(data[,1],data[,2]))
      } else {
        output[[paste0("plt",id_add)]] <- renderPlot(plot(data[,1],data[,4]))
      }
    })



  ## Remove Elements (for all plots) ###
observe({
  lapply(seq_len(length(alld$ui)), function(i){
    id_add <- i
    observeEvent(input[[paste0("remove_button", id_add)]], {
      alld$ui[[id_add]][1] <- NULL
    })
  })

})


}

shinyApp(ui = ui, server = server)