renderDataTable中单元格的条件格式
我有一个迷你闪亮的应用程序,它显示一个用户可以编辑的小表格。我想知道如何在此表中添加以下功能: 如果整行的最后一个单元格(列“Comment”)包含字符串“for yellow”,则将整行的背景更改为黄色;如果最后一个单元格包含字符串“for green”,则将整行的背景更改为绿色。这两个字符串永远不会同时出现在同一单元格中 我当前的代码(如下)有一个问题:如果在“注释”列中除了我的目标字符串“黄色”或“绿色”之外还有其他文本,那么格式就会消失。我希望它保持不变,即使最后一个单元格的文本中也存在其他字符串 非常感谢你renderDataTable中单元格的条件格式,r,shiny,dt,R,Shiny,Dt,我有一个迷你闪亮的应用程序,它显示一个用户可以编辑的小表格。我想知道如何在此表中添加以下功能: 如果整行的最后一个单元格(列“Comment”)包含字符串“for yellow”,则将整行的背景更改为黄色;如果最后一个单元格包含字符串“for green”,则将整行的背景更改为绿色。这两个字符串永远不会同时出现在同一单元格中 我当前的代码(如下)有一个问题:如果在“注释”列中除了我的目标字符串“黄色”或“绿色”之外还有其他文本,那么格式就会消失。我希望它保持不变,即使最后一个单元格的文本中也存在
library(shiny)
library(shinydashboard)
library(DT)
# ________________________________________________________________________________________
### UI code ####
ui <- dashboardPage(
dashboardHeader(title = "DataTable"),
dashboardSidebar(),
dashboardBody(
box(title = "Edit and Export",
DT::dataTableOutput("o_my_table", width = "600px")))
)
# _________________________________________________________________________________
### SERVER code ####
server <- function(input, output) {
### Generate an example table ####
my_data <- data.frame(
Order = 1:3, Name = c("John", "Mary", "Paul"),
Date = as.Date(c("2020-03-01", "2020-03-5", "2020-03-06")),
Amount = c(100, 150, 200), Paystatus = c("Yes", "No", "Yes"),
Comment = c(NA, "for yellow", "for green"), stringsAsFactors = FALSE)
### Define datatable ####
output$o_my_table <- DT::renderDataTable({
datatable(my_data,
extensions = "Buttons", # for table export
editable = list(target = "cell", disable = list(columns = 1)),
options = list(dom = "Bfrtip",
autoWidth = FALSE,
buttons = list(
list(extend = 'excel',
title = 'My Data',
text = 'Export data',
exportOptions = list(modifier = list(page = 'all')))),
columnDefs = list(list(width = "180px", targets = 1:3)))
) %>%
formatStyle('Comment', target = 'row',
backgroundColor = styleEqual("for yellow", 'yellow')) %>%
formatStyle('Comment', target = 'row',
backgroundColor = styleEqual("for green", 'green'))
})
### Define proxy datatable (needed for editable event) ####
proxyTable_my_table <- dataTableProxy("o_my_table")
### Observe edit cell of table ####
observeEvent(input$o_my_table_cell_edit, {
info <- input$o_my_table_cell_edit
i <- info$row # get row number
j <- info$col # get column number
v <- info$value
# my_data dataframe is being updated:
my_data[i, j] <<- v # global assignment should be ok because my_data is inside our server
replaceData(proxyTable_my_table, my_data, resetPaging = FALSE)
})
}
# ________________________________________________________________________________________
### Return a Shiny app object ####
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(shinydashboard)
图书馆(DT)
# ________________________________________________________________________________________
###用户界面代码####
ui您可以使用下面的styleContain
功能实现您想要的:
library(DT)
styleContain <- function(string, color){
JS(sprintf("value === null || value.match(/\\b%s\\b/) === null ? '' : '%s'",
string, color))
}
my_data <- data.frame(
Order = 1:3, Name = c("John", "Mary", "Paul"),
Date = as.Date(c("2020-03-01", "2020-03-5", "2020-03-06")),
Amount = c(100, 150, 200), Paystatus = c("Yes", "No", "Yes"),
Comment = c(NA, "xxx for yellow", "for green"), stringsAsFactors = FALSE)
datatable(my_data) %>%
formatStyle('Comment', target = 'row',
backgroundColor = styleContain("for yellow", 'yellow'))
我认为所有这些都可以通过您已经使用的DT
包的函数来实现。检查功能formatCurrency
,例如输入美元符号。请参阅,以获取对functions@bretauv非常感谢。把货币整理好了@bretauv I能够使用formatStyle('Comment',backgroundColor=styleEqual(“for yellow,'yellow'))让最后一列中的单元格更改背景色。但是,如果该单元格还包含其他字符串,例如“注释文本1,表示黄色”,则该单元格不起作用。如果它是最后一列中几个字符串中的一个,我如何使它更改背景?非常感谢-它几乎可以工作了。但是,它不能同时在两种条件下工作(黄色和绿色)。我试图用里面的(“绿色”、“绿色”)重复您的格式化代码(最后2行)。但是,着色只适用于最后一种情况。然后我尝试传递向量(请参阅下一行中的代码),但是该表根本没有出现:styleContain(c(“for yellow”、“for green”)、c(“yellow”、“green”))。是否可以以某种方式更改styleContain函数,使其与两个向量一起工作(字符串向量和颜色向量)?@user3245256查看我的编辑,我修复了它。但是我不理解它是如何工作的^^^不幸的是,它不工作。正如我在前面的评论中提到的,它只对底线做出反应(在您的示例中为绿色)。它忽略黄色。@user3245256对我来说,它可以工作。我修改了styleContain
函数。你确定复制了它吗?
library(DT)
styleContain <- function(string, color){
JS(sprintf("value === null || value.match(/\\b%s\\b/) === null ? value : '%s'",
string, color))
}
my_data <- data.frame(
Order = 1:3, Name = c("John", "Mary", "Paul"),
Date = as.Date(c("2020-03-01", "2020-03-5", "2020-03-06")),
Amount = c(100, 150, 200), Paystatus = c("Yes", "No", "Yes"),
Comment = c(NA, "xxx for yellow", "for green"), stringsAsFactors = FALSE)
datatable(my_data) %>%
formatStyle('Comment', target = 'row',
backgroundColor = styleContain("for yellow", 'yellow')) %>%
formatStyle('Comment', target = 'row',
backgroundColor = styleContain("for green", 'green'))