2016-09-12 6 views
1

私は、ユーザーがテーブル内の値を編集し、アクションボタンを使って対応するプロットを更新できるように、光沢のあるアプリを構築しています。また、ファイルをアップロードしてテーブルを作成し、プロットを更新できるようにしたいと思います。最初にテーブルをクリックせずに、アップロードされたデータでrhandsontableからプロットを更新するにはどうすればよいですか?

現時点では、ユーザーがハンドレントテーブルを作成するファイルをアップロードできるようになっていますが、アクションボタンがプロットを更新するには、最初にテーブルをクリックしてEnterキーを押す必要があります。

アップロードされたファイルからプロットを更新して、テーブルをクリックしてEnterキーを押すことなく、そのプロットを更新できるようにしたいと思います。誰かがこれを行う方法を知っていますか?

は、多分それは次のリンクを読み込むように同期されていない入力$の内容と出力$の内容に関係していますが、私はわからない:.CSVファイルの

https://github.com/jrowen/rhandsontable/blob/master/vignettes/intro_rhandsontable.Rmd#shiny

例その現在、アップロードされます:

Currency Values 
EUR   10 
GBP   20 
CAD    5 

私のコード今のところ:

library(shiny) 
library(rhandsontable) 

empty_mat = matrix(1,nrow = 3, ncol = 1) 
curr_names = c("EUR","GBP","CAD") 
empty_dat = cbind.data.frame(curr_names,empty_mat) 
names(empty_dat) = c("Currency","Values") 


ui = fluidPage(sidebarLayout(
    sidebarPanel(
     fileInput('file1', 'Choose CSV File'), 
     rHandsontableOutput('contents'), 
     actionButton("go", "Plot Update") 
    ), 
    mainPanel(
     plotOutput("plot1") 
    ) 
)) 

server = function(input, output) { 

    indat <- reactive({ 
    inFile <- input$file1 
    if (is.null(inFile)) 
     return(rhandsontable(empty_dat)) 
    raw_input = read.csv(inFile$datapath, header=T) 
    return(rhandsontable(raw_input)) 
    }) 

    output$contents <- renderRHandsontable({ 
    indat() 
    }) 

    portfoliovals <- eventReactive(input$go, { 
    live_data = hot_to_r(input$contents)[,2] 
    return(live_data) 
    }) 

    output$plot1 <- renderPlot({ 
    plot(portfoliovals()~c(1,2,3),type = "l") 
    }) 

} 


shinyApp(ui, server) 

更新9/27/16:

著者は親切にgithubでパッケージの新しいブランチをプッシュしました。これにより、元のコードが問題なく動作するようになりました。 詳細については、https://github.com/jrowen/rhandsontable/issues/111を参照してください。

+0

私はCRANで利用可能な最新バージョン0.3.3がこれを解決だと思います。それを使って、私は直ちに "Plot Update"を押すとプロットを作成することができますが、これは以前のバージョンでは発生しませんでした。 しかし、私はちょうど.cvsファイルをアップロードした後、 "Plot Update"ボタンを押してグラフを更新する前にテーブルをクリックする必要があります –

+0

私のマシンでバージョン0.3.3を使用しています。あなたが言うように、デフォルトのデータでうまくいくようです。しかし、私の主な質問は、データをアップロードして、最初にテーブルをクリックすることなくプロットを更新する方法があるかどうかです。 – pbarron

答えて

1

最後に、データをreactiveValuesに保存し、いくつかのオブザーバーを使用することで、これを機能させることができました。私は、これらのオブザーバーの熱心な評価が重要だと考えています。

新コード:

library(shiny) 
library(rhandsontable) 

empty_mat = matrix(1,nrow = 3, ncol = 1) 
curr_names = c("EUR","GBP","CAD") 
empty_dat = cbind.data.frame(curr_names,empty_mat) 
names(empty_dat) = c("Currency","Values") 


ui = fluidPage(sidebarLayout(
sidebarPanel(
    fileInput('file1', 'Choose CSV File'), 
    rHandsontableOutput('contents'), 
    actionButton("go", "Plot Update") 

), 
mainPanel(
    plotOutput("plot1") 
) 
)) 


server = function(input, output) { 

    indat <- reactiveValues(data=empty_dat) 

    observe({ 
    inFile = input$file1 
    if (is.null(inFile)) 
     return(NULL) 
    data1 = read.csv(inFile$datapath) 
    indat$data <- data1 
    }) 

    observe({ 
    if(!is.null(input$contents)) 
     indat$data <- hot_to_r(input$contents) 

    }) 

    output$contents <- renderRHandsontable({ 
    rhandsontable(indat$data) 
    }) 

    portfoliovals <- eventReactive(input$go, { 
    return(indat$data[,2]) 
    }) 

    output$plot1 <- renderPlot({ 
    plot(portfoliovals()~c(1,2,3),type = "l") 
    }) 

} 


shinyApp(ui, server)  
関連する問題