对于 R 中数据表函数的 rowCallback 选项内的 javascript 代码中的循环

For loop in javascript code inside rowCallback option of datatable function in R

我想使用 datatable 和选项中的 rowCallback 向 table 添加条件格式。 table 的大小会在 Shiny 应用程序中发生变化,我想根据第二列到最后一列中的值是否大于第一列中的值来应用背景。因此,我想在指定要格式化的列时合并一个 for 循环。

当我对要应用条件格式的列进行硬编码时,以下运行正常:

if (!require(devtools)) install.packages("devtools"); library(devtools)
if (!require(DT)) devtools::install_github("rstudio/DT"); library(DT)

trial <- matrix(c(3,4,1,2,1,2,4,2,5), ncol=3)
colnames(trial) <- c('value', 'min', 'max')
trial.table <- data.frame(trial)

DT::datatable(trial.table,options = list(rowCallback = JS('
                                                          function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {
                                                          if (parseFloat(aData[2]) > aData[1])
                                                          $("td:eq(2)", nRow).css("background-color", "orange");
                                                          if (parseFloat(aData[2]) > aData[1])
                                                          $("td:eq(3)", nRow).css("background-color", "orange");
                                                          }')))

但是,当我循环尝试此操作时,显示为空白:

DT::datatable(trial.table,options = list(rowCallback = JS('
                                                          function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {
                                                          for (i =2, i < 4, i++) {
                                                              if (parseFloat(aData[i]) > aData[1])
                                                              $("td:eq(i)", nRow).css("background-color", "orange");
                                                              }
                                                          }')))

for 循环在 R 中的 Javascript 内工作吗?

您缺少用于关闭 for 循环的右花括号。

好的,我明白了。这里有 2 个问题

  1. 语法错误。 JavaScript中for循环中的参数需要用分号分隔。
  2. 迭代变量i出现在for循环第二行的双引号中。因此,JS 不知道如何处理它,因为它在引号内。为了传递 i 的当前值,我们需要将它放在双引号之外。

-

trial <- matrix(c(3,4,1,2,1,2,4,2,5), ncol=3)
colnames(trial) <- c('value', 'min', 'max')
trial.table <- data.frame(trial)

DT::datatable(trial.table,options = list(rowCallback = JS('
                                                          function(nRow, aData) {
                                                          for (i=2; i < 4; i++) {
                                                              if (parseFloat(aData[i]) > aData[1])
                                                              $("td:eq(" + i + ")", nRow).css("background-color", "orange");
                                                              }
                                                          }')))