【问题标题】:How to order a DataTable using a hidden column如何使用隐藏列对 DataTable 进行排序
【发布时间】:2019-11-20 12:35:39
【问题描述】:

我对 R 比较陌生,我正在尝试使用 DT 包准备一个交互式数据表。我的数据包含数值,但其中一些值以 符号开头。对于我的数据表,我想要的是允许对数值进行交互式排序,无论前面是否有 符号。因此,例如 >10、8 应该排序为 8、9、>10。

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

这里有一些示例数据和一个脚本,其中我已经复制了列(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 上的表中的数据进行排序。

我发现这在 JavaScript 中应该是可能的:jQuery DataTables - Ordering dates by hidden column 但是,我无法弄清楚如何在 R 中做同样的事情,或者通过在 R 中使用合适的函数,或者通过使用 JS() 函数在 JavaScript 中提供它。

谁能帮我解决这个问题?

【问题讨论】:

    标签: r datatable dt


    【解决方案1】:

    这是使用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
    

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

    【讨论】:

    • 感谢您的建议! @Suliman 的解决方案正是我在隐藏列中寻找的,但是规避隐藏列的使用也非常整洁。我现在将找出这两种解决方案中哪一种最适合我的脚本!
    【解决方案2】:

    这是一种方法。要获取“排序键”,请使用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)
    

    【讨论】:

    • 感谢您的建议。虽然它会在第一次查看表格时以所需的方式对数据进行排序,但不幸的是,在使用交互式排序按钮时它没有正确排序数据。
    【解决方案3】:
    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 2015-04-01
      • 1970-01-01
      相关资源
      最近更新 更多