如何使用隐藏列对 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
此解决方案不需要隐藏列。
我是 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 中应该是可行的:
谁能帮我解决这个问题?
这是一种方法。要获得 "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
此解决方案不需要隐藏列。