我有一张桌子,想要根据X(= 6)不同深浅蓝色的值(0-100)为每个单元格着色。该表显示在TabPanel中。
目前我正在使用shinyjs来调用一个javascript函数来选择我的表并将CSS样式添加到<td>
标签,具体取决于值范围。
问题是,在第一次加载表格时(单击TabPanel),只有在重新加载后才显示颜色。
所以我要么在R中寻找解决方案(不需要额外的Javascript),要么自动重新加载Table / TabPanel。
library(shiny)
ui <- shinyUI(fluidPage(
tableOutput("dataTable")
))
server <- shinyServer(function(input, output) {
output$dataTable <- renderTable({
data <- getDataFromSomeWhere();
//Some operations on data
data
//I want to color every table cell, depening on value (f.e. 0-5 = white, 10-20 = light blue ...)
}, rownames = TRUE, colnames = TRUE)
shinyApp(ui = ui, server = server)
更新 最后我继续使用JavaScript解决方案,但使用闪亮的特定js事件来获得所需的效果:
$(document).on("shiny:value", function(e) {
if (e.name == "myComponent") {
e.preventDefault();
$('#myComponent').html(e.value);
//color code etc.
}
答案 0 :(得分:2)
您可以使用tableHTML
创建表格并有条件地设置它。
library(shiny)
library(tableHTML)
更改ui
以使用tableHTML
的输出函数:
ui <- shinyUI(fluidPage(
tableHTML_output("dataTable")
))
然后使用render_tableHTML()
呈现在其中生成的表。
您可以使用函数tableHTML()
创建纯HTML表。然后,您可以使用add_css_conditional_column()
创建条件(在本例中为between
)来更改背景颜色(注意:您也可以使用其他css。我使用#f6f6f6
代替{{ 1}}在示例中,因为您不会看到输出中的差异)
white
最终结果是:
server <- shinyServer(function(input, output) {
getDataFromSomeWhere <- reactive({
mtcars
})
output$dataTable <- render_tableHTML({
data <- getDataFromSomeWhere();
# //Some operations on data
data %>%
tableHTML(rownames = TRUE) %>%
add_css_conditional_column(conditional = 'between',
between = c(0, 5),
css = list(c('background-color'),
c('#f6f6f6')),
columns = 1:ncol(data)) %>%
add_css_conditional_column(conditional = 'between',
between = c(10, 20),
css = list(c('background-color'),
c('lightblue')),
columns = 1:ncol(data))
})
})
您可以在vignettes中找到有关如何使用shinyApp(ui = ui, server = server)
的更多详细信息。
答案 1 :(得分:1)
我认为最好的解决方案是使用DT
库功能。
该表在美学上更令人愉悦,并且还保留了可滚动表的功能。两者都立即缺少tableHTML
。
服务器包含renderDataTable
函数,用户可以在其中有条件地格式化表格:
server <- shinyServer(function(input, output) {
output$beautifulTable <- DT::renderDataTable({
# display top 5 rows at a time
options(DT.options = list(pageLength = 5))
# example dataframe
df = as.data.frame(cbind(matrix(round(rnorm(50), 3), 10), sample(0:1, 10, TRUE)))
# set conditions and return the beautiful table
return(datatable(df) %>% formatStyle('V6', backgroundColor = styleEqual(c(0, 1), c('gray', 'yellow'))))
})
}
UI只需调用dataTableOutput
:
ui <- shinyUI(fluidPage(
# display the beautiful table
dataTableOutput("beautifulTable")
))
显示结果:
shinyApp(ui = ui, server = server)
您将获得: 这里有更多示例:https://rstudio.github.io/DT/010-style.html