2016-11-25 7 views
1

ユーザーが行を選択できるテーブル(DT::renderDataTableを使用)を持つ光沢のあるアプリケーションを作成しています。しかし、ユーザーが望むものがまだテーブルにない場合は、新しい行を追加することもできます。私はユーザーが新しいデータを入力するための入力コントロールを使用していますが、入力ボタンを押すと入力値からテーブルに新しいデータ行を作成する必要があります。しかし、ボタンを押してもテーブルは更新されません。Shinyさん、DataTableをユーザー入力の新しい値で更新してください

最小限例:

library(shiny) 
library(DT) 
mydata = data.frame(id=letters[1:5], val=sample(10,5,T)) 

ui = fluidPage(dataTableOutput("table"), 
       textInput('NewID', 'Enter new ID'), 
       numericInput('NewVal', 'Enter new val', 1), 
       actionButton("goButton", "Update Table")) 

server = function(input,output){ 
    output$table = renderDataTable(mydata) 
    update = eventReactive(input$goButton, { 
    newrow = data.frame(id = input$NewID, val = input$NewVal) 
    mydata = rbind(mydata, newrow) 
    }) 
} 

shinyApp(ui,server) 

は明らかに、これは、このアプローチする間違った方法です。 renderDataTablemydatarenderUIobservereactiveに更新するコードの組み合わせを試してみましたが、正しい方法を見つけることができません。

これは私の最初の光沢のあるアプリなので、基本的なコンセプトがあるかもしれません。正しい方法は何ですか?

+0

'力でエラーが発生しました(デフォルト):グローバルだけでなくデータセット変更する<<-を使用することを忘れないでください。あなたはこのエラーを取得する@HubertLなしdefault'を – HubertL

+0

で、「値が」不足している引数をとき、ペーストし、コードを実行しますか?それは私のために実行されます。 – dww

+0

'numericInput()'の 'value'パラメータを提供する必要があります – HubertL

答えて

1

eventReactiveの結果をレンダリングし、更新されたデータセットを返すことができます。

server = function(input,output){ 
    output$table <- renderDataTable(df()) 
    df <- eventReactive(input$goButton, { 
    if(input$NewID!="" && !is.null(input$NewVal) && input$goButton>0){ 
     newrow = data.table(id = input$NewID, 
         val = input$NewVal) 
     mydata <<- rbind(mydata, newrow) 
     } 
    mydata 
    }, ignoreNULL = FALSE) 
} 
+0

優秀!それはまさにそこにあります。唯一の小さな問題は、ボタンが押される前に空白のIDを持つ新しい行を追加することです。あなたはそれを抑える方法を知っていますか? – dww

+0

ボタンがクリックされたことを意味する 'input $ goButton> 0 'というチェックを追加しました – HubertL

+0

これは今エラーをスローします – user5249203

関連する問題