Динамически добавить сюжет с заголовком в блестящем - PullRequest
0 голосов
/ 30 декабря 2018

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

Я пытался использовать for bucle, чтобы сгенерировать n чисел и показать их с использованием наблюдающего события, но это не работает для меня, так как основная часть графика игнорируется.

Чтобы убедиться, что у каждого графика есть свой главный заголовок, я сохраняю заголовок в data.frame и получаю к нему доступ из графика.

Вот код:

    library(shiny)

ui <- fluidPage(

    textInput("title","Title",""),
    actionButton("generate","Plot"),
    div(class="aux",style="width:300px;height:200px")

)


server <- function(input,output){

    observeEvent(input$generate,{
                  insertUI(
                      selector= ".aux",
                      where="beforeBegin",
                      ui = plotOutput(paste0("plot",input$generate))

                  )

        if(input$generate == 1){

            data <<- data.frame(title = input$title)
        }else{
            aux <- data.frame(title=input$title)
            data <<- rbind(data,aux)

        }   


    })

    for(i in 1:10){

        output[[paste0("plot",i)]] <- renderPlot(
            plot(rnorm(100),main=data[i,"title"])

        )


    }



}


shinyApp(ui,server)

Этот другой код делает то, что я действительно хочу сделать, но программирование для объявления вручную графиков нецелесообразно:

library(shiny)

ui <- fluidPage(

    textInput("title","Title",""),
    actionButton("generate","Plot"),
    div(class="aux",style="width:300px;height:200px")

)


server <- function(input,output){

    observeEvent(input$generate,{
                  insertUI(
                      selector= ".aux",
                      where="beforeBegin",
                      ui = plotOutput(paste0("plot",input$generate))

                  )

        if(input$generate == 1){

            data <<- data.frame(title = input$title)
        }else{
            aux <- data.frame(title=input$title)
            data <<- rbind(data,aux)

        }   


    })



        output$plot1 <- renderPlot(
            plot(rnorm(100),main=data[1,"title"])
        )
        output$plot2 <-    output$plot1 <- renderPlot(
            plot(rnorm(100),main=data[2,"title"])
        )





}


shinyApp(ui,server)

РЕДАКТИРОВАНИЕ :

Используя рекомендации Стефана Лорана, я поместил insertUI и вывод [[plot]] в наблюдаемое событие, но это не решает проблему, позволяющую редактировать заголовок графика, изменяя заголовок data.frame.Вот код:

library(shiny)
library(data.table)

ui <- fluidPage(
  column(6,
  textInput("title","Title",""),
  actionButton("generate","Plot"),
  div(id="aux")),
  column(6,
  textInput("newt","New title",""),
  selectInput("row","Row",choices=c(1:10)),
  actionButton("change","Change title"))


)


server <- function(input,output){
  observeEvent(input$change,{
    df$title <<- as.character(df$title)
    df[input$row,"title"]<-input$newt 


  })
  k <- 0
  observeEvent(input$generate, {
    insertUI(
      selector= "#aux",
      where="beforeBegin",
      ui = plotOutput(paste0("plot",input$generate))
    )
    k <- k + input$generate
    if(input$generate==1){
      df <<- data.frame(title = input$title)
      df$title <<- as.character(df$title)

    }else{

      aux <- data.frame(title = input$title)
      df <<- rbind(df,aux)
      df$title <<- as.character(df$title)
    }


    output[[paste0("plot",input$generate)]] <- renderPlot(
      plot(rnorm(100), main = df[k,"title"])      
    )









  })  
}

shinyApp(ui,server)

1 Ответ

0 голосов
/ 31 декабря 2018

Поместите renderPlot внутри наблюдателя:

library(shiny)

ui <- fluidPage(

  textInput("title","Title",""),
  actionButton("generate","Plot"),
  div(id="aux")

)


server <- function(input,output){

  observeEvent(input$generate, {
    insertUI(
      selector= "#aux",
      where="beforeBegin",
      ui = plotOutput(paste0("plot",input$generate))
    )

    output[[paste0("plot",input$generate)]] <- renderPlot(
      plot(rnorm(100), main = isolate(input$title))      
    )
  })  
}

shinyApp(ui,server)

РЕДАКТИРОВАТЬ

Решение для отредактированного вопроса:

library(shiny)

ui <- fluidPage(

  column(6,
         textInput("title","Title",""),
         actionButton("generate","Plot"),
         div(id="aux")),
  column(6,
         textInput("newt","New title",""),
         selectInput("row","Row",choices=c(1:10)),
         actionButton("change","Change title"))  
)    

server <- function(input,output){

  titles <- reactiveValues()

  observeEvent(input$change, {
    titles[[input$row]] <- input$newt
  })

  values <- replicate(10, rnorm(100))

  for(i in 1:10){
    local({
      ii <- i
      output[[paste0("plot",ii)]] <- renderPlot(
        plot(values[,ii], main = titles[[as.character(ii)]])
      )
    })
  }

  observeEvent(input$generate, {
    titles[[as.character(input$generate)]] <- input$title
    insertUI(
      selector = "#aux",
      where = "beforeBegin",
      ui = plotOutput(paste0("plot",input$generate))
    )
  })

}

shinyApp(ui,server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...