0

我想在更新基于“rhandsontable”的表时创建一个验证方案。我有两列:Min 和 Max,我希望当 Max 列中的一个单元格被更新时,只有它被允许更新为大于同一行中前一列 Min 的值,反之亦然。也许可以使用 hot_cols 渲染器并通过大于零的减法进行验证等。但我一般不熟悉“rhandsontable”或“hansontable”,尽管我认为这是可能的,但我不知道如何。谢谢。

玩具示例:

library(shiny)
library(rhandsontable)

if (interactive()) {

ui <- fluidPage(
   rHandsontableOutput('table'),
   tableOutput('table1')
)

server <- function(input, output,session) {
values <- reactiveValues(df=data.frame(Parameter=c('A','B','C'),Min=c(10,20,30),Max=c(20,30,40)))
observe({
  if(!is.null(input$table)){
    values$df <- hot_to_r(input$table)
    output$table1<-renderTable(values$df)
    }
})
output$table<-renderRHandsontable({ 
  rhandsontable(values$df)%>%
  hot_col("Parameter", readOnly = TRUE)%>%
  hot_validate_numeric(col='Min', min = 1, max = 50,allowInvalid = FALSE)%>%
  hot_validate_numeric(col='Max', min = 1, max = 50,allowInvalid = FALSE)
})
}
shinyApp(ui, server)
}
4

1 回答 1

2

这就是我在评论中所指的。您可能会发现它很复杂,但这就是server side使用rhandsontable.

在这个阶段,您可以自由地提出您需要的最复杂的功能。

作为一种更复杂(但可能更有效)的方法,您可以使用不同的合并语句,这些语句可以像连接一样工作,或者SQL使用非 equi 或主/辅助连接。dplyrdata.table

library(shiny)
library(rhandsontable)

ui <- fluidPage(column(6, 
   rHandsontableOutput('table')),
   column(6, tableOutput('table1'))
)

server <- function(input, output,session) {

df <- eventReactive( input$table,  {
  if (is.null(input$table))  {

        dfOld <<- df <- data.frame(Parameter=c('A','B','C'),Min=c(10,20,30),Max=c(20,30,40))

    } else {
        df <- hot_to_r(input$table)
        #  Quality control 
        # Rule 1:  
        if( any(df$Max > 9) & any(df$Min < 3) ) {
          df$Max <- dfOld$Max
          df$Min <- dfOld$Min
        } }
    dfOld <<- df
    df
  }, ignoreNULL = F)

output$table<-renderRHandsontable({ 

  if (is.null(df())) return()
  rhandsontable(df())%>%
  hot_col("Parameter", readOnly = TRUE)%>%
  hot_validate_numeric(col='Min', min = 1, max = 50,allowInvalid = FALSE)%>%
  hot_validate_numeric(col='Max', min = 1, max = 50,allowInvalid = FALSE)
})
}

shinyApp(ui, server)

请让我知道是否有用。

于 2017-04-24T21:55:08.730 回答