2017-04-20 42 views
0

我想在基於「rhandsontable」的表進行更新時創建驗證方案。我有兩列:最小值和最大值,我希望當Max列中的單元格更新時,只允許更新值大於前一列Min的值,反之亦然。也許有可能使用hot_cols渲染器並通過大於零的減法來驗證,等等,但我一般不熟悉「rhandsontable」或「hansontable」,雖然我認爲這是可能的,但我不知道如何。謝謝。使用rhandsontable R包進行單元格的數值驗證

玩具例子:

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) 
} 
+0

你有沒有考慮過在服務器端做這些細粒度的驗證?你可以進入服務器,不管輸入什麼,分析它,然後決定是否可以。客戶端適用於一般數據驗證(即範圍; num vs char等)。服務器案例似乎是更適合你所描述的那些挑戰的案例。 – Enzo

+0

嗨恩佐,我用rhandsontable作爲一個「窗體」與初始值,用戶可以在任何時候修改。我知道我可以使用其他小部件來輸入數據,例如textInput,但是當你有很多參數,並且這些參數是「實時」生成的,我認爲這個選項可以用於這種表格,以簡單的方式輸入值,但是在rhandsontable中,只能通過列控制格式(例如列最小 - 最大值),但我不知道如何包含條件來關聯兩列。 – Uli

+0

如果輸入最小20,最大10顯然是錯誤。所以,通過使用一些JavaScript或一些函數,我需要驗證這些值,然後繼續或顯示錯誤消息。總是在服務器端思考。我已經看到,當小於或大於固定值等時,可以使用渲染器函數來更改單元格的顏色,但我不知道如何將此行爲擴展到兩列。這對你有意義嗎? – Uli

回答

0

這就是我指的是在我的評論。您可能會發現它很複雜,但這是server side質量控制與rhandsontable的樣子。

在這個階段你可以自由地想出你需要的最複雜的功能。

作爲一個更爲複雜(但可能更有效)的方式來做到這一點,你可以有不同的MERGE語句,可以工作就像SQL加入,或使用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) 

請讓我知道是否有用。

+0

恩恩佐,謝謝你的提示。這工作!如您所示,我創建了一箇中間階段「a <-hot_to_r(input $ table)」,然後應用條件「if(any(a $ Min> a $ Max)){a message or alert}」。謝謝。這是一個好主意,因爲我在考慮應用一些條件,但是在「renderRHandsontable」級別,但是您是對的,當使用hot_to_r更新表時最好這樣做。乾杯。 – Uli