2017-06-03 17 views
1

這是問題如何在要用於函數的矢量中存儲無功輸出值?

How to isolate the output of a reactive (function) and save to a data.frame?

基本上我想基於與預定的和添加值的向量來構造一個表的一個擴展。我想以表格形式輸出原始矢量和一個具有此矢量前4個值的滾動平均值的列。舉例來說,如果用戶添加的值200,我會

d <- c(rep(100,4),200) 

和使用動物園:: rollapply()我有d的前面的4個值的平均值輥

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}) 

} 

回答

1

所以我會用太多不同的光澤機制說的和被絆倒了對方。我做了以下修改:

  • 改變observeobserveEvent,以限制計算你PRES當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幾次後執行以下操作:

enter image description here

+1

感謝邁克,這正是我需要什麼。我對如何在這個上下文中使用被動和觀察函數感到困惑,並且我不知道如何調用數據框的列(值$ df $ D)。這是我的第一個應用程序。 – Chene

+0

你的第一個Shiny應用程序已經很不錯了。這種編程(反應式)與您通常看到的非常不同。當你達到15分時,我會要求你考慮在這裏放棄一個upvote。 –

+0

當然,現在我沒有足夠的分數投票。但我肯定會這樣做。我編輯了我的原始帖子。請幫幫我。 – Chene