在另一个
post中,假设该表不是renderUI函数的一部分,则回答了同样的问题.
在下面的例子中,我试图调整相同的解决方案(使用JQuery),其中我想条件格式化的表属于renderUI函数.
library(shiny) library(datasets) script <- "$('tbody tr td:nth-child(5)').each(function() { var cellValue = $(this).text(); if (cellValue > 50) { $(this).css('background-color','#0c0'); } else if (cellValue <= 50) { $(this).css('background-color','#f00'); } })" shinyServer(function(input,output,session) { session$onFlushed(function() { session$sendCustomMessage(type='jsCode',list(value = script)) }) output$view <- renderTable({ head(rock,n = 20) }) output$Test1 <- renderUI({ list( tags$head(tags$script(HTML('Shiny.addCustomMessageHandler("jsCode",function(message) { eval(message.value); });'))),tableOutput("view") ) }) }) shinyUI(fluidPage( tabsetPanel( tabPanel("Test1",uIoUtput("Test1")),tabPanel("Test2") ) ))
在这个小例子中,条件格式化不适用于表格
解决方法
将你的调用更改为session $onFlushed,每次闪亮刷新被动系统时,通过添加参数一次调用你的函数= FALSE:
session$onFlushed(function() { session$sendCustomMessage(type='jsCode',list(value = script)) },once = FALSE)
在一个自包含的例子中:
library(shiny) library(datasets) script <- "$('tbody tr td:nth-child(5)').each(function() { var cellValue = $(this).text(); if (cellValue > 50) { $(this).css('background-color','#0c0'); } else if (cellValue <= 50) { $(this).css('background-color','#f00'); } })" runApp(list(server = function(input,session) { session$onFlushed(function() { session$sendCustomMessage(type='jsCode',FALSE) output$view <- renderTable({ head(rock,n = 20) }) output$Test1 <- renderUI({ list( tags$head(tags$script(HTML('Shiny.addCustomMessageHandler("jsCode",tableOutput("view") ) }) },ui = fluidPage( tabsetPanel( tabPanel("Test1",tabPanel("Test2") ) )) )