2017-04-20 1 views
0

"rhandsontable"을 기반으로하는 테이블을 업데이트 할 때 유효성 검사 체계를 만들고 싶습니다. 저는 두 개의 컬럼을 가지고 있습니다 : Min과 Max 그리고 Max 컬럼의 셀이 업데이트 될 때, 같은 컬럼에서 이전 컬럼 Min보다 큰 값으로 업데이트가 가능하거나 그 반대의 경우도 가능합니다. 어쩌면 hot_cols 렌더러를 사용하고 0보다 큰 뺄셈 등으로 유효성을 검사하는 것이 가능할 수도 있습니다. 그러나 이것이 가능하다고 생각하지만 일반적으로 "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에서는 열로 형식을 제어 할 수 있다고 생각했습니다. (예 : min-max by column)하지만 두 열과 관련된 조건을 포함시키는 방법을 예로 들지 않습니다. – Uli

+0

min 20을 입력하면 최대 10은 분명히 오류입니다. 그래서, 일부 자바 스크립트를 사용하여 일부 값을 유효화하고 계속하거나 오류 메시지를 표시해야하는 함수를 사용합니다. 항상 서버 측에서 생각하고 있습니다. 렌더러 함수를 사용하여 고정 된 값보다 작거나 큰 경우 셀의 색상을 변경할 수 있음을 알았지 만이 동작을 두 개의 열로 확장하는 방법을 알지 못합니다. 이것은 당신에게 이해가 되니? – Uli

답변

0

이것은 내가 내 댓글에 언급 된 것입니다. 복잡한 것을 발견 할 수도 있지만 품질 관리는 rhandsontable과 같습니다.

이 단계에서 필요한 가장 복잡한 기능을 자유롭게 구상 할 수 있습니다. 당신이 dplyr 또는 data.table 비 동등 또는 1 차/2 차 조인을 SQL처럼 작동 가입, 또는 사용할 수있는 다른 병합 문을 가질 수이 할 수있는 더 복잡한 (하지만 아마도 더 효율적으로) 방법으로

.

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 $> $ Max)) {메시지 또는 경고}"조건을 적용했습니다. 감사. 이는 "renderRHandsontable"의 수준에서 어떤 조건을 적용하려고 생각했기 때문에 좋은 생각 이었지만 여러분이 옳았다면, hot_to_r을 사용하여 테이블을 업데이트 할 때 그것을하는 것이 낫습니다. 건배. – Uli

관련 문제