我正在创建一个具有两个输出的闪亮应用程序datatableoutput和plotoutput.I在数据帧中有两个变量st和et,该变量将被初始化为一个值,我需要向现有的具有以下逻辑的数据框架中添加新的行
1. New `st` value is previous value of `et`.
2. New `et` value is previous value of `st - 1000`.
3. New value of`st` and `et` should be added as new row in my dataframe after every 5 seconds.基于新添加的行,线图应该得到更新。
下面是我的ui.r和server.r代码,目前我能够根据逻辑创建st和et的新值,但未能添加新行并绘制图表
Ui.r
library(shiny)
shinyUI(fluidPage(
titlePanel("Incremental Plots"),
sidebarLayout(
sidebarPanel(),
mainPanel(
tableOutput('var')
)
)
))Server.r
library(shiny)
start_time <- 100000
end_time <- start_time - 1000
shinyServer(function(input,output,session){
omega <- reactive({
invalidateLater(1000, session)
#dataf <<- data.frame(st = c(start_time),et = c(end_time))
return(dataf)
})
# update non reactive value
observe({
omega()
start_time <<- end_time
end_time <<- start_time - 1000
dataf <<- data.frame(st = start_time,et = end_time)
})
output$var <- renderTable(omega())
})发布于 2018-06-12 08:52:14
为此,您可以使用reactiveVal和observe的组合。请注意,您可以用reactiveVal调用名为x的x()的值,并且可以通过执行x(y)将其值设置为y。下面给出了一个工作示例,希望这会有所帮助!

library(shiny)
ui<- shinyUI(fluidPage(
titlePanel("Incremental Plots"),
sidebarLayout(
sidebarPanel(),
mainPanel(
tableOutput('var')
)
)
))
start_time <- 100000
end_time = start_time - 1000
server<- function(input,output,session){
# Initialize
reval_omega <- reactiveVal(data.frame(st = c(start_time),et = c(end_time)))
reval_start <- reactiveVal(start_time)
reval_end <- reactiveVal(end_time)
# update our reactiveVal
observe({
invalidateLater(1000, session) # every second
isolate({
reval_start(reval_end()) # set start time to current end time
reval_end(reval_start() - 1000) # set end time to start - 1000
omega_new <- data.frame(st = reval_start(),et = reval_end()) # create a new row for the dataframe
reval_omega(rbind(reval_omega(),omega_new)) # rbind the reval_omega() and the new row, and store result in reval_omega()
})
})
output$var <- renderTable(reval_omega())
}
shinyApp(ui,server)https://stackoverflow.com/questions/50812251
复制相似问题