web-dev-qa-db-fra.com

Produire plusieurs lignes de texte avec renderText () en R brillant

Je souhaite générer plusieurs lignes de texte à l'aide d'une seule commande renderText(). Cependant, cela ne semble pas possible. Par exemple, à partir du tutoriel brillant , nous avons tronqué du code dans server.R:

shinyServer(
  function(input, output) {
    output$text1 <- renderText({paste("You have selected", input$var)
    output$text2 <- renderText({paste("You have chosen a range that goes from",
      input$range[1], "to", input$range[2])})
  }
)

et code dans ui.R:

shinyUI(pageWithSidebar(

  mainPanel(textOutput("text1"),
            textOutput("text2"))
))

qui imprime essentiellement deux lignes:

You have selected example
You have chosen a range that goes from example range.

Est-il possible de combiner les deux lignes output$text1 et output$text2 dans un bloc de code? Mes efforts ont jusqu'à présent échoué, par exemple.

output$text = renderText({paste("You have selected ", input$var, "\n", "You have chosen a range that goes from", input$range[1], "to", input$range[2])})

Quelqu'un a des idées?

59
Alex

Vous pouvez utiliser renderUI et htmlOutput à la place de renderText et textOutput.

require(shiny)
runApp(list(ui = pageWithSidebar(
  headerPanel("censusVis"),
  sidebarPanel(
    helpText("Create demographic maps with 
      information from the 2010 US Census."),
    selectInput("var", 
                label = "Choose a variable to display",
                choices = c("Percent White", "Percent Black",
                            "Percent Hispanic", "Percent Asian"),
                selected = "Percent White"),
    sliderInput("range", 
                label = "Range of interest:",
                min = 0, max = 100, value = c(0, 100))
  ),
  mainPanel(textOutput("text1"),
            textOutput("text2"),
            htmlOutput("text")
  )
),
server = function(input, output) {
  output$text1 <- renderText({paste("You have selected", input$var)})
  output$text2 <- renderText({paste("You have chosen a range that goes from",
                                    input$range[1], "to", input$range[2])})
  output$text <- renderUI({
    str1 <- paste("You have selected", input$var)
    str2 <- paste("You have chosen a range that goes from",
                  input$range[1], "to", input$range[2])
    HTML(paste(str1, str2, sep = '<br/>'))

  })
}
)
)

Notez que vous devez utiliser <br/> comme un saut de ligne. De plus, le texte que vous souhaitez afficher doit être échappé en HTML, utilisez donc la fonction HTML.

89
jdharrison

Selon Joe Cheng :

Euhhh, je ne recommande pas d'utiliser renderUI et htmlOutput [de la manière qui est expliquée dans l'autre réponse]. Vous prenez du texte qui est fondamentalement du texte et forcez le code HTML sans vous échapper (en d'autres termes, si le texte contient une chaîne contenant des caractères HTML spéciaux, il peut être analysé de manière incorrecte).

Que diriez-vous de cela à la place:

textOutput("foo"),
tags$style(type="text/css", "#foo {white-space: pre-wrap;}")

(Remplacez le foo dans #foo par l'ID de votre textOutput)

7
theforestecologist