Javascript JS()中作为HTML的R字符串

Javascript JS()中作为HTML的R字符串,javascript,jquery,html,r,datatables,Javascript,Jquery,Html,R,Datatables,我试图创建一个datatable对象,它的每一行都有一个子表。我遵循谢一辉给出的示例的格式 这个例子展示了如何传入一个简单的字符串,我甚至可以做一些基本的表格。但是我不想硬编码很多HTML,因为R有很好的工具为我编写HTML 我的问题是,如果我让用户R生成一个字符串作为HTML,当我通过JS将其传递到datatable对象时,它会将其作为文本读取,而不是将其呈现为HTML 我确信这是一个简单的解决方案,但是使用htmltools::htmlprefer和htmltools::HTML不会改变任何

我试图创建一个datatable对象,它的每一行都有一个子表。我遵循谢一辉给出的示例的格式

这个例子展示了如何传入一个简单的字符串,我甚至可以做一些基本的表格。但是我不想硬编码很多HTML,因为R有很好的工具为我编写HTML

我的问题是,如果我让用户R生成一个字符串作为HTML,当我通过
JS
将其传递到datatable对象时,它会将其作为文本读取,而不是将其呈现为HTML

我确信这是一个简单的解决方案,但是使用
htmltools::htmlprefer
htmltools::HTML
不会改变任何东西,我怀疑我必须在javascript中做些什么

DT::datatable({
    mtcars$rows <- 
      paste0("<tr><td>Gas Mileage</td><td>", mtcars$mpg, "</td></tr>",
             "<tr><td>Quarter Mile</td><td>", mtcars$qsec, "</td></tr>")
    cbind(' ' = '&oplus;', mtcars)
  },
  escape = c(-2, -13),
  selection = "single",
  options = list(
    columnDefs = list(
      list(visible = FALSE, targets = c(0, 13)),
      list(orderable = FALSE, className = 'details-control', targets = 1)
      )
    ),
  callback = JS("
    table.column(1).nodes().to$().css({cursor: 'pointer'});
    var format = function(d) {
      return '<table>' + 
             '<tr><td>Variable</td><td>Value</td></tr>' + 
             d[13] + 
             '</table>';
    };
    table.on('click', 'td.details-control', function() {
      var td = $(this), row = table.row(td.closest('tr'));
      if (row.child.isShown()) {
        row.child.hide();
        td.html('&oplus;');
      } else {
        row.child(format(row.data())).show();
        td.html('&CircleMinus;');
      }
    });"
  )
)
DT::数据表({

mtcars$rows尝试将
escape=c(-2,-13)
替换为


现在来看,
escape
变量被传递到
datatables
escapeData
函数中,希望它能为您提供一些指导,告诉您如何正确定制应该/不应该转义的内容。:)


尝试将
escape=c(-2,-13)
替换为.Yep,这真的很简单。这是我今天的RTFM时刻。
escape
参数采用R索引(从1开始),而
columnDefs
callback
采用javascript索引(从0开始)你的建议让我想到了这个区别。如果我把它改成
escape=c(-2,-14)
,它与
escape=FALSE
一样有效。啊,很好!我理解
-2
部分。但是你是如何得到
-14
的?'mtcars'有11列。我在
&oplus;
前面加上了
数据表
的行名。这使得行名成为第1列,
&oplus
第2列,以及
mtcars
包含第3-13列。我的HTML代码被固定在
mtcars
的末尾,总共有14列。包含HTML的两列是第2列和第14列(通过R索引)。
# `i` here is your `escape` variable which can be either TRUE/FALSE, 
# indices, or colnames.
escapeData = function(data, i, colnames) {
  if (is.null(data) || prod(dim(data)) == 0 || identical(i, FALSE)) return(data)

  // see below for definition of convertIdx
  i = convertIdx(i, colnames, ncol(data))
  # only escape character columns (no need to escape numeric or logical columns)
  data[i] = lapply(data[i], function(x) {
    if (is.character(x) || is.factor(x)) htmlEscape(x) else x
  })
  data
}


# convertIdx looks like this: 
# convert character indices to numeric
convertIdx = function(i, names, n = length(names), invert = FALSE) {
  if (!is.character(i)) return({
    if (invert) {
      if (is.numeric(i)) -i else if (is.logical(i)) !i else {
        stop('Indices must be either character, numeric, or logical')
      }
    } else i
  })
  if (is.null(names)) stop('The data must have column names')
  o = setNames(seq_len(n), names)
  i = o[i]
  if (any(is.na(i)))
    stop("Some column names in the 'escape' argument not found in data")
  if (invert) o[-i] else i
}