首页 > 解决方案 > Shiny中的内联文本输出

问题描述

我对制作闪亮的应用程序比较陌生。我遇到了一个问题,我试图最简化相关部分。基本上,我想在固定文本内有一个输出文本。这是简化版的样子:

library(shiny)

ui <- fluidPage(
  sliderInput(inputId = "value", label = "Input your number here", min = 0, max =  30, step = 1, value = 16),
  p("Your result is ", textOutput(outputId = "result"), ".")
)

server <- function(input, output){
  output$result <- renderText({
    if(input$value >= 15)
      return("good")
    else
      return("bad")
  })
}

shinyApp(ui = ui, server = server)

如果滑块在 15 或更多,您可以看到文本应该具有“好”作为输出。但是,不是像我想要的那样这样做:Your result is good.它这样做:

Your result is

good
.

textOutput是否在p()标签内似乎并不重要。paste0()而且paste似乎只会使情况变得更糟:

ui <- fluidPage(
  sliderInput(inputId = "value", label = "Input your number here", min = 0, max =  30, step = 1, value = 16),
  p(paste("Your result is ", textOutput(outputId = "result"), "."))
)

Your result is <div id="result" class="shiny-text-output"></div> .

它在一行中,但确实不是我想要的。

我不知道是否有一种方法可以在不将整个句子写在renderText函数内的情况下完成这项工作。这是可行的,但我觉得应该有一种方法可以做到这一点,而无需重复句子的其余部分。不过,我明白如果没有。但是,我想知道为什么...


写完之后,我意识到我可以在服务器端这样做:

ui <- fluidPage(
  sliderInput(inputId = "value", label = "Input your number here", min = 0, max =  30, step = 1, value = 16),
  p(textOutput(outputId = "result"))
)

server <- function(input, output){
  output$result <- renderText({
    if(input$value >= 15)
      text <- "good"
    else
      text <- "bad"
    
    paste0("Your data is ", text, ".")
  })
}

它奏效了:Your data is good.。但是我仍然不明白为什么如果我在 ui 中这样做它不起作用......是否有可能,我只是没有做某事,或者它就是这样工作的?为什么?我不明白......为什么它会跳到行,写输出,然后继续下一行?

到目前为止,我的问题更多是关于理解它(不)如何工作以及为什么工作而不是实际问题,但是当我知道自己在做什么时,我工作得最好,所以我仍然认为这是一个有效的问题......

标签: rshiny

解决方案


添加inline=T删除换行符

p("Your result is", textOutput(outputId = "result"), ".") ## old 
p("Your result is", textOutput(outputId = "result", inline=T), ".") ## new

这给了

Your result is good .

帮助文件中,inline控制span是否div使用

inline       use an inline (span()) or block container (div()) for the output

期间之前有一个空格,我目前无法弄清楚如何删除它。但我想我还是会发布这个,因为它是其中的一部分,也许你知道如何删除它。

完整代码

library(shiny)

ui <- fluidPage(
  sliderInput(inputId = "value", label = "Input your number here", min = 0, max =  30, step = 1, value = 16),
  p("Your result is", textOutput(outputId = "result", inline=T), ".")
)

server <- function(input, output){
  output$result <- renderText({
    if(input$value >= 15)
      return("good")
    else
      return("bad")
  })
}

shinyApp(ui = ui, server = server)

推荐阅读