如何使用隐藏列对 DataTable 进行排序

How to order a DataTable using a hidden column

我是 R 的新手,我正在尝试使用 DT 包准备交互式数据 table。我的数据包含数值,但其中一些值前面有 < 或 > 符号。我想要的是我的数据 table 是允许对数值进行交互式排序,而不管它前面是否有 < 或 > 符号。因此,例如 >10、<5、9、>8 应该排序为 <5、>8、9、>10。

我最初的做法是复制包含带有 < 和 > 符号的数值的列,从这个重复的列中删除 < 和 > 符号,并将此数据转换为数值以获得带有只有数值。然后我想要的是能够根据这些数值对 table 中的数据进行排序,但是我希望能够在单击包含带有 < 和的数值的列的排序按钮时执行此操作> 迹象。因此,我想隐藏仅包含数值的列(因为我不希望此列出现在 table 中),但我想以某种方式 link 原始列的排序函数到这个隐藏的列。

这里有一些示例数据和一个脚本,我已经在其中复制了列(b 到 c),删除了 < 和 > 符号,并将其转换为数值以获得列 c,然后我得到了隐藏:

library(DT)

df <- data.frame(a=1:5, b=c('10','5.0','2.0','< 1.0','> 20'), c=c(10,5,2,1,20))
DT <- DT::datatable(df, 
                    options = list(columnDefs = 
                                   list(list(visible=FALSE, 
                                             targets=3))))
DT

我无法找到一种方法来使用 b 列的排序按钮对隐藏列 c 上 table 中的数据进行排序。

我发现这在 JavaScript 中应该是可行的: 但是,我无法弄清楚如何在 R 中执行相同的操作,要么通过在 R 中使用 suitable 函数,要么通过使用 JS() 函数在 JavaScript 中提供它。

谁能帮我解决这个问题?

这是一种方法。要获得 "sorting key" 使用 order

library(DT)
# df <- data.frame(a=1:5, b=c('10','5.0','2.0','< 1.0','> 20'), c=c(10,5,2,1,20))
df <- data.frame(a = 1:5, b = c('10', '5.0', '2.0', '< 1.0', '> 20'))
df
#ONE APPROACH
df$c <-
  stringr::str_replace(string = df$b,
                       pattern = "[<>]",
                       replacement = "") %>%
  as.numeric()
#ANOTHER APPROACH
df$c <- gsub("[<>]", "", df$b) %>% as.numeric()

DT::datatable(df[order(df$c), -3], rownames = FALSE)
library(DT)

df <- data.frame(a=1:5, b=c('10','5.0','2.0','< 1.0','> 20'), c=c(10,5,2,1,20))
DT <- DT::datatable(df, 
                    options = list(columnDefs = 
                                     list(list(visible=FALSE, targets=3),
                                          list(orderData=3, targets=2)
                                          )))
DT

注意:这个答案是基于这个 ,但是 DT 现在使用 R 索引而不是 JS 索引。

这是一个使用 render 的解决方案:

library(DT)

render <- c(
  "function(data, type, row){",
  "  if(type === 'sort'){",
  "    return parseFloat(data.match(/\d+\.?\d+/)[0]);",
  "  }else{",
  "    return data;",
  "  }",
  "}"
)
df <- data.frame(
  a = 1:5, 
  b = c('10','5.0','2.0','< 1.0','> 20')
)
DT <- datatable(df, 
                options = list(
                  columnDefs = list(
                    list(render = JS(render), type = "num", targets = 2)
                  )
                )
)
DT

此解决方案不需要隐藏列。