使用updateInputSlider更新格式的非标准评估:bug?

时间:2017-11-24 22:29:39

标签: html r shiny non-standard-evaluation

我有一个闪亮的应用程序,它具有在几种语言之间翻译文本的功能,通过使用一些RenderText和一个ActionButton在语言之间切换。  这是我的应用程序:

library(shiny)
trads = list(text3=list("text3 in language 1", "text in other language"),
             titl3=list("widget label in language 1", "widget label in other language"))

ui <- fluidPage(
  actionButton("language",label="language", icon=icon("flag")),
  htmlOutput("text3", container = tags$h3),
  sliderInput("slider1", label=h2("slider1"), 0, 10, 5)
)

server <- function(input, output, session) {


     tr <- function(text){sapply(text, function(s) trads[[s]][[input$language%%2+1]], USE.NAMES=FALSE)}

     output$text3 = renderText({tr("text3")})

     observeEvent(input$language, {
          updateSliderInput(session, "slider1", label=tr("titl3"))
     })

}

shinyApp(ui, server)

除了我的滑块标签最初使用html标签h3()进行格式化之外,它工作正常,当我使用updatesliderinput时,我松开了这个标签并返回纯文本。我尝试使用paste0或与eval不同的语法在翻译中添加标记,但它会在文本中打印粘贴的结果而不是运行它或给出错误。 在保持格式的同时翻译的任何想法?感谢

注意:我对包含URL链接的一个文本存在同样的问题。

1 个答案:

答案 0 :(得分:2)

你真的发现你在updateSliderInput发现了一个错误。它只能处理纯字符串而不能处理HTML标记。作为一种解决方法,我建议您在UI的开头添加类似的东西

tags$head(
    tags$style(
      'label[for = "slider1"] {
    color: red;
    font-size: 20px;
    }'
    )
  )

但是将css更改为您喜欢的内容(可能会复制h2标记的css规则),然后始终只将字符串传递给label参数。这样,样式始终保持不变。

我的完整代码

library(shiny)
trads = list(text3=list("text3 in language 1", "text in other language"),
             titl3=list("widget label in language 1", "widget label in other language"))

ui <- fluidPage(
  tags$head(
    tags$style(
      'label[for = "slider1"] {
    color: red;
    font-size: 20px;
    }'
    )
  ),
  actionButton("language",label="language", icon=icon("flag")),
  htmlOutput("text3", container = tags$h3),
  sliderInput("slider1", label="slider1", 0, 10, 5)

)

server <- function(input, output, session) {


  tr <- function(text){sapply(text, function(s) trads[[s]][[input$language%%2+1]], USE.NAMES=FALSE)}

  output$text3 = renderText({tr("text3")})

  observeEvent(input$language, {
    updateSliderInput(session, "slider1", label=tr("titl3"))
  })

}

shinyApp(ui, server)

希望这有帮助!