2017-06-03 15 views
1

これは質問リアクティブ出力値を関数で使用するベクトルに格納する方法はありますか?

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

の拡張では、基本的に私は、予め決められており、付加価値のベクトルに基づいて、テーブルを構築します。私は元のベクトルとこのベクトルの前の4つの値のロール平均を持つ列をtableoutputとして表示します。ユーザは値200を追加した場合、例えば、私は

md <- rollapply(d , mean , fill = NA, width = list(-1:-4)) 

が期待Dの前の4つの値のロール平均値を有する)(

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

及び使用動物園:: rollapplyを有するであろう私は値を追加する場合、アプリケーションの近くに私の機能を使用することはできませんよ、私の光沢のあるアプリで

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

だから私は、あまりにも多くの異なる光沢のあるメカニズムを使用していたし、彼らはお互いにつまずくたと言うでしょう。私は、次の変更を加えました:

  • はときPRES updateボタンに計算を閉じ込めるするようobserveEventobserveを変更しました。
  • は、observeではなく、observeEventで不要なので、isolateの使用方法ではなくなりました。
  • reactiveValuesリストに既に保存されているデータを持っているため、md()という反応がありません。
  • rollingapplyにすると、データフレーム全体ではなく関連する列でのみ動作します。余分な引用符の場合は処分した、c(rep(...))c()など
  • はそれビットの圧縮 -
  • は構文ビットをクリーンアップ。
  • as.numericinput$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

あなたの最初のシャイニーアプリにはかなり遠いです。この種のプログラミング(反応的)は、あなたが通常見るものとはまったく異なります。私はあなたが15ポイントに達するときにもアップフォートをドロップすることを検討するよう依頼します。 –

+0

もちろん、私は投票するには十分なポイントがありません。しかし、私は確かにそれを行います。元の投稿を編集しました。私を助けてください。 – Chene

関連する問題