2017-04-20 9 views
0

"rhandsontable"に基づくテーブルが更新されたときに検証スキームを作成したいと思います。私は2つの列を持っています: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

サーバー側でこの種の細かい検証を行うと考えましたか?入力されたものは何でもサーバー上で取得し、それを分析してOKかどうかを判断できます。クライアント側は、一般的なデータ検証(範囲:num vs charなど)に適しています。サーバーケースは、あなたが説明するもののような、より挑戦的なもののための正しいケースと思われます。 – Enzo

+0

こんにちはエンツォ、私はユーザーがいつでも変更できる初期値で "フォーム"としてrhandsontableを使用しています。別のウィジェットを使用してデータを入力することができます。あなたが多くのパラメータを持っていて、これらが "オンザフライ"で生成されている場合、私はこの種のテーブルを使って簡単に値を入力するオプションを考えていましたが、 (例:min-max by column)しかし、私はどのように2つの列を関連付けるための条件を含めるかはしません。 – Uli

+0

min 20とmax 10を入力すると、明らかにエラーになります。だから、私はこれらの値を検証し、続行するか、エラーメッセージを表示する必要がいくつかの関数をいくつかのjavascriptを使用して。常にサーバー側で考える。レンダラー関数を使用して固定値などより小さいか大きい場合にセルの色を変更することは可能ですが、この動作を2つの列に拡張する方法はわかりません。これはあなたに合っていますか? – Uli

答えて

0

これは私が私のコメントでに言及されたものです。あなたはそれが複雑であるかもしれませんが、server side品質管理はrhandsontableのようになります。

この段階では、必要な最も複雑な機能を思いつくことができます。あなたはSQLが参加、またはdplyrまたはdata.table非エクイまたは参加するプライマリ/セカンダリを使用するように働くことができるさまざまなMERGE文を持っている可能性があり、これを行うために、より複雑な(しかし、おそらく、より効率的な)方法として

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)){メッセージまたはアラート}"を適用しました。ありがとう。私はいくつかの条件を適用することを考えていたが、 "renderRHandsontable"のレベルで考えていたので、これは良いアイデアでした。しかしあなたが正しいとしたら、hot_to_rを使ってテーブルを更新するときにそれを行う方が良いです。乾杯。 – Uli

関連する問題