我正在使用rhandsontable构建一个闪亮的应用程序,以便用户可以编辑表格中的值,然后使用操作按钮更新相应的图表。我还希望他们能够上传一个文件,然后填充表格,然后更新图表。
截至目前,我已设法允许用户上传填充动手的文件,但为了让动作按钮更新绘图,他们必须先点击进入表格然后按回车。
我希望他们能够从上传的文件中更新情节,而无需点击进入表格然后按回车。有人知道怎么做吗?
也许它与输入$内容和输出$内容不同,如以下链接所示,但我不确定:
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。
答案 0 :(得分: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)