Как я могу отнести кнопку действия к вставленному графику (insertUI / removeUI) в блестящем - PullRequest
0 голосов
/ 19 февраля 2019

Я задал этот вопрос в сообществе RStudio и не получил помощи, поэтому пробую здесь:

Я пытаюсь добавить следующие функции в свое приложение: Когдапользователь вставляет график, должна появиться кнопка удаления, которая специально удаляет график, который был вставлен одновременно.Приложение основано на 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)

При вставке графика он получает идентификатор, например 1Element1 или 2Element2.Теперь мне интересно, как кнопка удаления может ссылаться только на график с этим точным идентификатором?

До сих пор я работал с одной кнопкой удаления, которая удаляет последний вставленный график, определяя вектор, в котором хранятся идентификаторы.,

selector = paste0('#', inserted[length(inserted)])

Это не очень полезно, когда пользователю нужно сравнить много графиков.У меня ограниченное понимание использования этих селекторов, и я совершенно не представляю, как можно использовать кнопку удаления для каждого графика, который удаляет только соответствующий график.Любая помощь будет принята с благодарностью.

Кроме того, эта ссылка может помочь, поскольку она показывает аналогичную функциональность (которую я, очевидно, не смог реализовать).

1 Ответ

0 голосов
/ 19 февраля 2019

В такой ситуации я всегда использую «список» с «реактивными значениями», как показано ниже:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...