R Shiny - 通过列排序禁用数据表中的特定行

2023-12-03

下面的应用程序包含一个数据表iris启用行选择的数据集。我想专门禁用前 3 行的选择。我可以使用发布的解决方案来做到这一点here。当表在应用程序启动时初始化时,该解决方案工作正常:

enter image description here

但是,当您对列上的行进行排序时,例如在Species按降序排列,它禁用观察值 101、102 和 103,因为排序后它们现在是表的前 3 行:

enter image description here

我猜发生这种情况是因为rowCallback is displayIndex禁用行。所以在启动时,displayIndex0、1 和 2 分别对应于 iris 数据集中的观测值 1、2 和 3,行回调会禁用它们的行选择,因为indices.indexOf(displayIndex) > -1 is true对于这些行。但排序之后Species, displayIndex0、1 和 2 分别对应于观测值 101、102 和 103,因此回调会禁用它们。

为了解决这个问题,我尝试通过更改来禁用基于行名的行displayIndex in the rowCallback功能为dataIndex。但是,这会造成一些奇怪的情况,每次我在不同的列上进行筛选时,附加行都会被禁用。这是表格首次排序后的示例Sepal.Length, then Sepal.Length然后最后Petal.Length:

enter image description here

这是重现上述内容的代码:

library(DT)
library(shiny)

disabled_rows = c(1,2,3)

#NOTE: displayIndex changed to dataIndex
rowCallback <- c(
  "function(row, data, displayNum, dataIndex){",
  sprintf("  var indices = [%s]", toString(disabled_rows - 1)),
  "  if(indices.indexOf(dataIndex) > -1){",
  "    $(row).find('td').addClass('notselectable').css({'background-color': '#eee', 'color': '#bbb'});",
  "  }",
  "}"
)

get_selected_rows <- c(
  "var id = $(table.table().node()).closest('.datatables').attr('id');",
  "table.on('click', 'tbody', function(){",
  "  setTimeout(function(){",
  "    var indexes = table.rows({selected:true}).indexes();",
  "    var indices = Array(indexes.length);",
  "    for(var i = 0; i < indices.length; ++i){",
  "      indices[i] = indexes[i];",
  "    }",
  "    Shiny.setInputValue(id + '_rows_selected', indices);",
  "  }, 0);",
  "});"
)

drag_selection <- c(
  "var dt = table.table().node();",
  "$(dt).selectable({",
  "  distance : 10,",
  "  selecting: function(evt, ui){",
  "    $(this).find('tbody tr').each(function(i){",
  "      if($(this).hasClass('ui-selecting')){",
  "        table.row(i).select();",
  "      }",
  "    });",
  "  }",
  "}).on('dblclick', function(){table.rows().deselect();});"
)

shinyApp(
  ui = fluidPage(
    tags$head(tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js")),
    DTOutput('table')
  ),

  server = function(input, output, session) {  

    output$table <- renderDT({

        datatable(
          iris,
          callback = JS(get_selected_rows),
          class = 'hover row-border order-column',
          options = list(
          rowCallback = JS(rowCallback), 
          select = list(style = "multi", selector = "td:not(.notselectable)")
          ), 
        extensions = "Select", selection = 'none'
        )
    }, server = F)

    observe({

      print(input$table_rows_selected)

    })
  }
)

我不知道为什么要改变displayIndex to dataIndex不起作用,我不知道还能尝试什么。 DataTables 的定义dataIndex范围here由于我对 DT 插件不太熟悉,所以对我来说很模糊,所以我将不胜感激。

EDIT:我还尝试直接基于 rowname 禁用,如下所示:

rowCallback <- c(
  "function(row, data, displayNum, displayIndex){",
  "  var indices = [0, 2, 4, 15]",
  "  if(indices.indexOf(data[0]) > -1){",
  "    $(row).find('td').addClass('notselectable');",
  "  }",
  "}"
)

奇怪的是dataIndex不起作用。

您可以使用行的一些 id 来代替。

disabled_rows = paste0("'", paste0("row", c(1,2,3)), "'")

rowCallback <- c(
  "function(row, data, displayNum, displayIndex){",
  sprintf("  var indices = [%s];", toString(disabled_rows)),
  "  if(indices.indexOf($(row).attr('id')) > - 1){",
  "    $(row).find('td').addClass('notselectable').css({'background-color': '#eee', 'color': '#bbb'});",
  "  }",
  "}"
)

dat <- iris
dat$ID <- paste0("row", 1:nrow(iris))
rowNames <- TRUE
colIndex <- as.integer(rowNames)


output$table <- renderDT({

  datatable(
    dat,
    rownames = rowNames,
    callback = JS(get_selected_rows),
    class = 'hover row-border order-column',
    options = list(
      rowId = JS(sprintf("function(data){return data[%d];}", 
                         ncol(dat)-1+colIndex)),
      rowCallback = JS(rowCallback), 
      select = list(style = "multi", selector = "td:not(.notselectable)")
    ), 
    extensions = "Select", selection = 'none'
  )
}, server = TRUE)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R Shiny - 通过列排序禁用数据表中的特定行 的相关文章

  • 如何使用 JQuery 选择没有特定子元素的元素

    是否有一个 JQuery 选择器来选择所有元素not有某个子元素作为直接子元素吗 例如 p text in paragraph p p p div text in div div 我只想选择 p 就像第一个 没有 p div 孩子 这可能吗
  • Html2canvas 忽略图像的对象拟合

    我一直在尝试利用 html2canvas 来截取元素的屏幕截图 我注意到 div 元素内使用 object fit 属性的图像在 html2canvas 屏幕截图后被拉伸 有没有为此散步 这是我的代码
  • R如何在ggplot2中为金字塔状图添加面标签

    我创建了类似金字塔的图 我想为图的每一侧添加标签 类似于小平面标签 我的数据 dt lt data frame Answer factor x rep x c 1 3 times 2 labels c Yes No Maybe Gender
  • 自下而上的砌体堆叠

    我想从下往上堆叠我的砌体砖 这个问题之前已经回答过 但是 Masonry 的修改和分支现在使用了非常旧的脚本版本 新版本的 Masonry 修复了我需要的错误 那么有谁知道如何将旧的解决方案应用到新的脚本中 这是旧的解决方案 https s
  • 在 Rails 中调用 javascript 函数 onclick

    我的观点之一有以下代码
  • 如何对每行具有不同列位置的矩阵进行子集化? [复制]

    这个问题在这里已经有答案了 我想为每一行使用不同的 但一列 列来对矩阵进行子集化 那么申请可以完成这项工作吗 但也许智能子集也可以工作 但我还没有找到解决方案 计算时间是一个问题 我有一个带有 for 循环的解决方案 但多次将矩阵加载到 R
  • 通过jquery在日期框中自动添加斜杠/符号[重复]

    这个问题在这里已经有答案了 我发现几个问题但没有答案 所以我问问题 如何添加自动斜杠 符号
  • jquery validate - 如果隐藏字段有值则有效

    我需要根据隐藏字段的值验证字段 我尝试了这个自定义规则 jQuery validator addMethod cityselected function if featureID val return false else return t
  • Google 地图自动完成 - 最多 3 个字符类型

    我已经实现了带有搜索框的谷歌地图 它允许用户通过搜索来选择地址 在该搜索框中 即使我输入 1 个字符 它也会进行搜索 我希望用户至少输入 3 个字符 否则它不应该进行搜索 My JS Fiddle is http jsfiddle net
  • 获取顶部框架的 URL

    在 Facebook 应用程序中 我需要检查顶部框架 主窗口 URL 是什么 并相应地显示内容 我尝试使用以下内容 if top location toString toLowerCase indexOf facebook com lt 0
  • R:连接到 Teradata 时 JDBC() 找不到 Java 驱动程序路径

    我正在尝试通过 RStudio 连接到 Teradata 但由于某种原因 JDBC 函数在识别 Java 驱动程序所在的路径时出现问题 请参阅下面的代码 library RODBC library RJDBC library rJava b
  • 如何并排展开和折叠三个div?

    document ready function toggle click function if this data name show sidebar animate width 10 hide map animate width 89
  • 避免 IE 中因背景图像而出现“混合内容”警告的具体规则是什么?

    这与SSL 和 CSS 背景图像导致的混合内容 https stackoverflow com questions 1548551 ssl and mixed content due to css background images但这个问
  • 如何在 R闪亮中使操作不间断

    在我闪亮的应用程序中 我有一个应该不断更新自身的输出 但是每当我执行长时间运行的计算时 输出就会暂停 我的问题是 如何让输出持续不间断地运行 请参阅下面的简短演示 时钟每一秒刷新一次 但如果我单击运行 5 秒的按钮 时钟就会暂停 libra
  • jQuery 在页面上查找电话号码并包含在 链接中

    这是一个与这个从未得到解答的老问题类似的问题 使用 jquery 将 https stackoverflow com questions 4607753 wrap a tag around phone number using jquery
  • Highcharts 异步服务器加载多个系列

    我正在尝试按照其示例使用 Highcharts 的延迟加载 http www highcharts com stock demo lazy loading http www highcharts com stock demo lazy lo
  • 绘制 grobs 列表

    披露 我不确定如何为这个问题制作一个可重现的例子 我正在尝试使用以下方法绘制 grobs 列表gridExtra包裹 我有一些代码看起来像这样 Make Graphic Objects for Spec and raw traces for
  • 将列类型转换为数字时更改值

    我有一个具有上面格式的数据文件 我将其加载到 R 中 并尝试使用 dist 列中的值绘制直方图 但出现错误 x 必须是数字 因此我尝试更改格式 gt head data V1 V2 1 type gene dist 2 A 64667 3
  • 就像以前一样,但在未来

    有一个很酷的 jQuery 插件叫做timeago http timeago yarp com 它将过去的时间转换为人类可读的格式 我希望未来能有类似的事情 我正在开发电视节目调度程序 引用自文档 http timeago yarp com
  • Leaflet R 闪亮:选择和缩放

    我正在开发一个带有闪亮和传单的工具 我希望当客户点击变量时 参见 UI 代码 例如 NE 地图会转到另一个视图 例如纯传单中的这样 L easyButton strong NE strong function zoomTo setView

随机推荐