r - 在闪亮的数据表中具有计算的可编辑列
问题描述
我有一个可编辑的数据表。这里的目标是让用户根据需要进行编辑GRPs/TRPs
。编辑该列后,该Costs($)
列将相应更新。在这里,我尝试编写一些 JS 代码并将其合并到数据表回调参数中。JS 代码有问题,我不知道它是什么。我对JS很陌生。
# the math behind it
cost = OVERRIDE_CPP * GRPs/TRPs
df <- data.frame (Market = c("ALBANY-SCHENECTADY-TROY, NY", "ALBUQUERQUE-SANTA FE"),
Weeks = c(1, 1),
OVERRIDE_CPP = c(141.7, 188),
GRPs_TRPs = c(100L, 100L),
Cost = c(14170, 18800),
Impressions = c(2053.993,2053.993)
)
# Coster DataTable JS function
CosterTableJS <- function() {
return(
JS(
"var ok = true;",
"function onUpdate(updatedCell, updatedRow, oldValue) {",
" var column = updatedCell.index().column;",
" if(column === 4){",
" ok = false;",
" }else if(column === 3){",
" ok = true;",
" }",
"}",
"",
"// make the datatable",
"var format_datatable = function(d, rowIdx){",
" // footer callback to display the totals",
" var footerCallback = function(tfoot, data, start, end, display){",
" var api = this.api();",
"// update the Cost when the GRP/TRP's are changed",
" var col_trp_grp = api.column(3).data();",
" var col_override_cpp = api.column(2).data();",
" if(ok){",
" for(var i = 0; i < col_trp_grp.length; i++){",
" api.cell(i,4).data(parseFloat(col_trp_grp[i]) * parseFloat(col_override_cpp[i]));",
" }",
" }",
" Shiny.setInputValue('weeklyData:weeklyData', table.data().toArray());",
" }",
" var n = d.length - 1;",
" var id = 'table#';",
" var columns = Object.keys(d[n][0]).map(function(x){",
" return {data: x, title: x};",
" });",
" if (Object.keys(d[n][0]).indexOf('_details') === -1) {",
" var subtable = $(id).DataTable({",
" 'data': d[n],",
" 'columns': columns,",
" 'autoWidth': true,",
" 'deferRender': true,",
" 'info': false,",
" 'lengthChange': false,",
" 'ordering': d[n].length > 1,",
" 'order': [],",
" 'paging': true,",
" 'scrollX': false,",
" 'scrollY': false,",
" 'searching': false,",
" 'sortClasses': false,",
" 'pageLength': 50,",
" 'footerCallback': footerCallback,",
" 'columnDefs': [",
" {targets: [0, 1, 2, 3, 4, 5]},",
" {targets: '_all', className: 'dt-center'}",
" ]",
" });",
" } else {",
" var subtable = $(id).DataTable({",
" 'data': d[n],",
" 'columns': columns,",
" 'autoWidth': true,",
" 'deferRender': true,",
" 'info': false,",
" 'lengthChange': false,",
" 'ordering': d[n].length > 1,",
" 'order': [],",
" 'paging': true,",
" 'scrollX': false,",
" 'scrollY': false,",
" 'searching': false,",
" 'sortClasses': false,",
" 'pageLength': 50,",
" 'footerCallback': footerCallback,",
" 'columnDefs': [",
" {targets: -1, visible: false},",
" {targets: 0, orderable: false, className: 'details-control'},",
" {targets: '_all', className: 'dt-center'}",
" ]",
" }).column(0).nodes().to$().css({cursor: 'pointer'});",
" }",
"};"
)
)
}
coster_callback_js <- CosterTableJS()
rowNames <- FALSE
# Table
datatable(
df,
callback = coster_callback_js,
rownames = rowNames,
style = "bootstrap4",
extensions = 'Buttons',
options = list(
dom = "Bt",
columnDefs = list(
list(width = '300px', targets = 0)
),
lengthMenu = list(c(-1, 10, 20),
c("All", 10, 20))
)
)
解决方案
推荐阅读
- javascript - 理解这个 JS WeakRef polyfill 实现
- tensorflow - 关于模块“tensorflow.python.platform.build_info”没有属性“cudnn_version_number”
- python - TypeError:在 Django 项目中声明上下文处理器时,“NoneType”对象不可迭代
- javascript - 用css创建searchBar问题不影响它
- javascript - 设置静态 File 节点的 publicURL,或者在 Gatsby 中创建一个重复的文件节点
- c# - 处理来自多个方法的异常
- java - Tomcat 服务器能否使用与 Visual Studio Code Java 扩展不同的 JVM
- powershell - 使用调用表达式传递 secureString 参数
- android - 更新后 VS Code Flutter 自动热重载不起作用
- rest - 在 API 网关中为 REST API 设置 $default 路由