无法将变量传递给闪亮和htmltemplate中的样式属性

时间:2019-01-11 03:05:18

标签: r shiny

我使用的是闪亮的,但利用了自己的自定义CSS和html。我遇到了一个问题,我无法将值从服务器传递到UI并将其放在div标签内。​​

我的目标是:

######all my code#####
<div style="color:{{textOutput("my_variable")}}"
####rest of code####

无论出于何种原因,闪亮都不会干净地传递值,因此我的应用无法正确加载。

这是完整的代码

library(shiny)

test_date <- as.Date(c('2019-01-01','2019-01-02','2019-01-03','2019-01-04'))
score <- c(75,80,85,90)
my_dataframe <- data.frame(test_date, score)

getColor <- function(x) {
  if (x > 80) {
    result <- "green"
  }
  else if (x > 50) {
    result <- "yellow"
  }
  else {
    result <- "red"
  }
  return(result)
}

ui <- htmlTemplate(
  text_ = '
  <html>
  <head> 
  {{headContent()}}
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <script type="application/shiny-singletons"></script>
  <script type="application/html- dependencies">json2[2014.02.04];jquery[1.12.4];shiny[1.2.0]</script>
  </head>
  <body>
  <div style="color:{{textOutput("score_color")}}">{{textOutput("score_value")}}</div>
  </body>
  </html>'
)
server <- function(input, output, session) {
  output$score_value <- renderText(
    {mean(my_dataframe$score)}
  )
  output$score_color <- renderText(
    {getColor(mean(my_dataframe$score))}
  )
}
shinyApp(ui, server)

因此,如果此方法正常,我将看到红色文本显示82.5的答案。

1 个答案:

答案 0 :(得分:2)

我认为Shiny并不是要输出纯文本。您可以在服务器中构建div并输出UI:

library(shiny)

test_date <- as.Date(c('2019-01-01','2019-01-02','2019-01-03','2019-01-04'))
score <- c(75,80,85,90)
my_dataframe <- data.frame(test_date, score)

getColor <- function(x) {
  if (x > 80) {
    result <- "green"
  }
  else if (x > 50) {
    result <- "yellow"
  }
  else {
    result <- "red"
  }
  return(result)
}

ui <- htmlTemplate(
  text_ = '
  <html>
  <head> 
  {{headContent()}}
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <script type="application/shiny-singletons"></script>
  <script type="application/html- dependencies">json2[2014.02.04];jquery[1.12.4];shiny[1.2.0]</script>
  </head>
  <body>
  {{uiOutput("score_value")}}
  </body>
  </html>'
)
server <- function(input, output, session) {
  output$score_value <- renderUI(
    div(
      renderText(
        {mean(my_dataframe$score)}
      ),
      style=paste0('color:',getColor(mean(my_dataframe$score)),';')
    )
  )
}
shinyApp(ui, server)