我的闪亮应用程序具有以下功能。除了由reactiveValues
嵌套的反应性DT allocation_engine()
组成的表格外,用户还可以输入DT
列中自动分配的金额(“分配”),但要遵守一些输入约束。通过使用reactiveValues
,此脚本可以正常工作。
我还通过允许DT可编辑来实现在“分配”列中手动输入单元格的功能。这些条目受一个约束。 我的脚本在某种意义上起作用,即约束一次处于活动状态,但不再处于活动状态!首先,让我详细说明一下;
必须保留用户的手动输入DT$Allocation[i] <= DT$AIA[i]
,其中AIA只是DT
所呈现的reactiveValues
中的另一列。因此,如果DT$AIA = c(10,20)
,则DT$Allocation[2]
的最大手动输入为20。如果用户输入30,则实际实现的输入应为20。
底线:此限制有效,但仅在您首次超过该限制时!在上面的示例中;如果我输入DT$Allocation[2] = 30
一次,由于限制,结果输入为20。下次我在同一单元格中输入30时,该限制无效,并且该单元格输入为30,而DT似乎没有更新。
为了实现此逻辑,我遵循了Yihui的可编辑DT指南: https://github.com/rstudio/DT/issues/28#issuecomment-236293247
在某些背景下,另一个与编辑DT表有关的SO问题: R Shiny DT - edit values in table with reactive
我的代码如下。如果您认为可以帮助我,很高兴提供更多信息。
# Container for reactive values created here:
allocation_values = reactiveValues(rendered = NULL)
observe({
rendered = allocation_engine()
allocation_values$rendered = rendered
})
# The reactiveValue container is rendered as an editable DT
output$alloc_table = DT::renderDataTable(
allocation_values$rendered,
server=TRUE,
rownames = FALSE,
options=list(pageLength=10, search = list(smart = TRUE)),
selection = 'none',
editable = TRUE
)
alloc_table_proxy = DT::dataTableProxy('alloc_table')
observeEvent(input$alloc_table_cell_edit, {
#When the user carries out a manual entry:
info = input$alloc_table_cell_edit
str(info)
i = info$row
j = info$col
v = min(info$value, allocation_values$rendered$AIA[i])
# ^ Create a value [v] that is the minimum of the entry and the
# corresponding AIA of the same row as the entry
if (j == 9) { # If the input column is "Allocation"
# replace the selected row in Allocation with the
# variable [v] calculated above
allocation_values$rendered$Allocation[i] = DT::coerceValue(v,
allocation_values$rendered$Allocation[i])
# This step is actually unnecessary for my implementation,
# but included in Yihui's guide.
replaceData(alloc_table_proxy, allocation_values$rendered,
resetPaging=TRUE, rownames=FALSE)
}}
谢谢,