在 R 中使用 renderText() 输出多行文本
Posted
技术标签:
【中文标题】在 R 中使用 renderText() 输出多行文本【英文标题】:Outputting multiple lines of text with renderText() in R shiny 【发布时间】:2014-06-07 15:34:03 【问题描述】:我想使用一个renderText()
命令输出多行文本。然而,这似乎是不可能的。例如,从shiny tutorial 我们截断了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]))
)
和ui.R
中的代码:
shinyUI(pageWithSidebar(
mainPanel(textOutput("text1"),
textOutput("text2"))
))
基本上打印两行:
You have selected example
You have chosen a range that goes from example range.
是否可以将output$text1
和output$text2
这两行代码合并为一个代码块?到目前为止,我的努力都失败了,例如
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]))
有人有什么想法吗?
【问题讨论】:
【参考方案1】:您可以使用renderUI
和htmlOutput
代替renderText
和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/>'))
)
)
)
请注意,您需要使用<br/>
作为换行符。此外,您希望显示的文本需要进行 HTML 转义,因此请使用 HTML
函数。
【讨论】:
谢谢。我想没有html代码就没有办法做到这一点?HTML()
包裹是离合器。乍一看,我担心这是一个 hack,并且是唯一可用的选项......但实际上这个答案中的大部分代码都来自问题的示例。在renderUI()
内部切换到HTML()
,然后在ui.R
侧切换到htmlOutput()
非常简单。不错的答案!
@Alex 我猜你也可以使用 verbatimTextOutput() 而不是 textOutput(),但你可能不想要灰色阴影。
+1 不错的答案。你将如何格式化HTML()
中的文本?例如,HTML("<b>paste(str1, str2, sep = '<br/>')<\b>")
不起作用
如果你有兴趣回答,我已经创建了这个thread【参考方案2】:
根据Joe Cheng:
嗯,我不建议使用
renderUI
和htmlOutput
[以其他答案中解释的方式]。您正在获取基本上是文本的文本,并在不转义的情况下强制转换为 HTML(这意味着如果文本恰好包含一个包含特殊 HTML 字符的字符串,则可能会被错误地解析)。这个怎么样:
textOutput("foo"),
tags$style(type="text/css", "#foo white-space: pre-wrap;")
(将#foo 中的 foo 替换为您的 textOutput 的 ID)
【讨论】:
【参考方案3】:如果你的意思是你不关心换行符:
output$text = renderText(
paste("You have selected ", input$var, ". You have chosen a range that goes
from", input$range[1], "to", input$range[2], ".")
)
【讨论】:
以上是关于在 R 中使用 renderText() 输出多行文本的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Graphics32 中检索 RenderText 的确切文本宽度
在 RShiny 中,当 downloadHandler 中缺少预期文件时,使用 renderPrint/renderText 显示错误