R 数据表模式可编辑-限制特定列和行

R 数据表模式可编辑-限制特定列和行,r,shiny,dt,R,Shiny,Dt,我想限制datatable中列和行的可编辑模式。 目前,在这个最小的示例中,我只能编辑特定的列,但它不适用于限制行(不允许行1到5) 有人有主意吗 谢谢你提前通知 library(shiny) library(DT) shinyApp( ui = fluidPage(DTOutput('tbl')), server = function(input, output) { output$tbl = renderDT( datatable(data = iris,

我想限制datatable中列和行的可编辑模式。 目前,在这个最小的示例中,我只能编辑特定的列,但它不适用于限制行(不允许行1到5)

有人有主意吗

谢谢你提前通知

library(shiny)
library(DT)
shinyApp(
  ui = fluidPage(DTOutput('tbl')),
  server = function(input, output) {
    output$tbl = renderDT(
      datatable(data = iris, 
                options = list(lengthChange = FALSE),
                editable = list(target = 'column', disable = list(columns = c(1:3), rows = c(1:5))))
    )
  }
)

您可以根据我提供的链接修改代码,如下所示

library(shiny)
library(DT)

disabled_rows = paste0("'", paste0("row", c(1,2,3)), "'")   ### disabled rows are listed here

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'});",
  "  }",
  "}"
)

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();});"
)
dat <- iris
dat$ID <- paste0("row", 1:nrow(iris))
rowNames <- TRUE
colIndex <- as.integer(rowNames)

shinyApp(
  ui = fluidPage(DTOutput('tbl')),
  server = function(input, output, session) {
    
    
    ### disable selected rows only
    # output$tbl <- 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)

    ###  disable selected rows and columns
    output$tbl <- renderDT({

      datatable(
        dat,
        rownames = rowNames,
        callback = JS(get_selected_rows),
        class = 'hover row-border order-column',
        options = list(
          lengthChange = FALSE,
          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", 
        editable = list(target = 'column', disable = list(columns = c(2:3) )), selection = 'none',
      )
    }, server = TRUE)

    ### disable selected columns only
    # output$tbl = renderDT(
    #   datatable(data = iris,
    #             options = list(lengthChange = FALSE),
    #             #extensions = "Select", selection = 'none',
    #             editable = list(target = 'column', disable = list( columns = c(2:3) )) )
    # )
  }
)
库(闪亮)
图书馆(DT)
disabled#u rows=paste0(“”,paste0(“row”,c(1,2,3)),“”))。##这里列出了禁用的行

rowCallback您可以根据我提供的链接修改代码,如下所示

library(shiny)
library(DT)

disabled_rows = paste0("'", paste0("row", c(1,2,3)), "'")   ### disabled rows are listed here

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'});",
  "  }",
  "}"
)

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();});"
)
dat <- iris
dat$ID <- paste0("row", 1:nrow(iris))
rowNames <- TRUE
colIndex <- as.integer(rowNames)

shinyApp(
  ui = fluidPage(DTOutput('tbl')),
  server = function(input, output, session) {
    
    
    ### disable selected rows only
    # output$tbl <- 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)

    ###  disable selected rows and columns
    output$tbl <- renderDT({

      datatable(
        dat,
        rownames = rowNames,
        callback = JS(get_selected_rows),
        class = 'hover row-border order-column',
        options = list(
          lengthChange = FALSE,
          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", 
        editable = list(target = 'column', disable = list(columns = c(2:3) )), selection = 'none',
      )
    }, server = TRUE)

    ### disable selected columns only
    # output$tbl = renderDT(
    #   datatable(data = iris,
    #             options = list(lengthChange = FALSE),
    #             #extensions = "Select", selection = 'none',
    #             editable = list(target = 'column', disable = list( columns = c(2:3) )) )
    # )
  }
)
库(闪亮)
图书馆(DT)
disabled#u rows=paste0(“”,paste0(“row”,c(1,2,3)),“”))。##这里列出了禁用的行

你可以从这里改写答案:你好,谢谢你的评论。不幸的是,我没有掌握JS语言。我不知道从哪里开始:你有主意吗?更改回调函数?您可以从这里调整答案:您好,谢谢您的评论。不幸的是,我没有掌握JS语言。我不知道从哪里开始:你有主意吗?更改回调函数?谢谢!但当我尝试这段代码时,我看到了颜色的变化(对于行1、2、3),但我可以编辑所有行。谢谢!但当我尝试这段代码时,我看到了颜色的变化(对于行1、2、3),但我可以编辑所有行。