1

ユーザーがテーブル内の値を編集し、アクション ボタンを使用して対応するプロットを更新できるように、rhandsontable を使用して光沢のあるアプリを構築しています。また、ファイルをアップロードして、テーブルにデータを入力し、プロットを更新できるようにしたいと思います。

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

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

おそらく、次のリンクで読み取られるように、input$contents と output$contents が同期していないことに関係しているのかもしれませんが、よくわかりません。

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

現在アップロードされる .csv ファイルの例:

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)

2016 年 9 月 27 日更新:

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

4

1 に答える 1

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)    
于 2016-09-15T13:43:01.183 に答える