可编辑的Shiny / DT中受约束的单元格输入仅激活一次

时间:2018-08-23 14:48:53

标签: r shiny dt

我的闪亮应用程序具有以下功能。除了由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)                            
}}

谢谢,

0 个答案:

没有答案