这是问题的扩展
How to isolate the output of a reactive (function) and save to a data.frame?
基本上我想基于具有预定和附加值的向量构建表。我想将tableoutput显示为原始向量和一个列,该列具有此向量的前4个值的滚动平均值。例如,如果用户添加了值200,我将
d <- c(rep(100,4),200)
并使用zoo :: rollapply()我有前面4个值d
的滚动平均值md <- rollapply(d , mean , fill = NA, width = list(-1:-4))
预期结果
cbind(d,md)
d md
[1,] 100 NA
[2,] 100 NA
[3,] 100 NA
[4,] 100 NA
[5,] 200 100
在我的闪亮应用程序中,我无法使用我的功能,当我添加值时应用关闭。但是,如果我使用其他函数,如输入$ c1 + 5,它的工作原理。我认为问题在于我不知道如何捕获更新的向量并使用它来运行需要向量作为输入的函数。此外,要运行应用程序,我需要匹配新列中相同的行数。
这是我的UI代码:
library(shiny)
fluidPage(
sidebarPanel(textInput("c1","example"),
actionButton("update", "Update Table")
),
mainPanel(tableOutput("example")
)
)
和服务器
library(shiny)
library(zoo)
function(input, output) {
#Example
d <- c(rep(100,4))
m <- c(rep(100,4))
md <- reactive(
rollapply(values$df , mean , fill=NA , width=list(-1:-4))
)
values <- reactiveValues(df = data.frame('D' = d, 'M_D'= m))
newEntry <- observe({
if(input$update > 0) {
values$df <- isolate(rbind(values$df,data.frame('D' =input$c1,
'M_D' = md())))
}
})
output$example <- renderTable({values$df})
}
答案 0 :(得分:3)
所以我会说使用太多不同的闪亮机制,他们互相绊倒。我做了以下更改:
observe
更改为observeEvent
,以便将计算限制在您按下update
按钮时。isolate
用法,因为observeEvent
不需要observe
。md()
函数,因为您已将该数据存储在reactiveValues
列表中。rollingapply
仅在相关列而不是整个数据框上运行。c()
中有无关的引号,c(rep(...))
等等,我就不知道了。as.numeric
添加到input$c1
处理中,否则会导致该列转换为因子并更改其值。所以这是代码:
library(shiny)
library(zoo)
u <- fluidPage(
sidebarPanel(textInput("c1","example"),
actionButton("update", "Update Table")
),
mainPanel(tableOutput("example")
)
)
s <- function(input, output) {
#Example
d <- rep(100,4)
m <- rep(100,4)
values <- reactiveValues(df = data.frame(D=d, M_D=m))
newEntry <- observeEvent(input$update,{
d_new <- c(values$df$D,as.numeric(input$c1))
m_d_new <- rollapply(d_new, mean , fill=NA , width=list(-1:-4))
values$df <- data.frame(D=d_new,M_D=m_d_new)
})
output$example <- renderTable({values$df})
}
shinyApp(u,s)
在输入200
并按Update Table
几次后,会产生以下结果: