2017-03-17 14 views
1

別のデータフレーム(B)を使用してデータフレーム(A)を更新します。 Bはuiにあり、ユーザはテーブルBのデータを更新するオプションを持っています。Bの更新された値に基づいて、Aを更新したいと思います。以下のコードを参照してください。ボタン:ユーザ入力に基づくデータセットの値を置き換えます。

df2 <- structure(list(A = c(1L, 4L, 0L, 1L), 
         B = c("3", "*", "*", "2"), 
         C = c("4", "5", "2", "*"), 
         D = c("*", "9", "*", "4")), 
       .Names = c("A", "B", "C", "D"), 
       class = "data.frame", 
       row.names = c(NA, -4L)) 
df1 <- structure(list(variable = c("A", "B", "C", "D"), 
         Value = c(2L,1L, 9L, 0L)), 
       .Names = c("variable", "Value"), 
       class = "data.frame", 
       row.names = c(NA, -4L)) 
shinyApp(
    ui <- 
    fluidPage(
     titlePanel("Sample"), 

     # Create a new row for the table. 
     sidebarLayout(
     sidebarPanel(
      selectInput("select", label = h3("Select Variable"), 
         choices = unique(df1$variable), 
         selected = unique(df1$variable)[1]), 
      numericInput("num", label = h3("Replace * with"), 
          value = unique(df1$variable)[1]), 
      actionButton("applyChanges", "Apply Changes")), 
     mainPanel(
      dataTableOutput(outputId="table") 
     ))), 
    Server <- function(input, output) { 

    # Filter data based on selections 
    output$table <- renderDataTable({ 
     df1$Value[df1$variable==input$select] <<- input$num 
     df1 
    }) 
    df2_new <- eventReactive(input$applyChanges,{ 
     df1[as.character(df1$variable)] <- Map(function(x, y) 
     replace(x, x=="*", y), df2[as.character(df1$variable)], df1$Value) 
     df2_new <- df2 
     return(df2_new) 
    }) 
    }) 

ご協力いただければ幸いです。ありがとう!!

+2

あなたは大きなありがとうマイク・ワイズ@ 'reactiveValues' – HubertL

答えて

1

これは私が考えるつもり何を行います

library(shiny) 
# old df2 
dfaa <- data.frame(A = c(1L, 4L, 0L, 1L), 
        B = c("3","*","*","2"), 
        C = c("4","5","2","*"), 
        D = c("*","9","*","4"),stringsAsFactors = F) 
# old df1 
dfbb <- data.frame(variable = c("A","B","C","D"), 
        Value = c(2L, 1L, 9L, 0L),stringsAsFactors = F) 

ui <- fluidPage(titlePanel("Sample"), 
    sidebarLayout(
    sidebarPanel(
     selectInput("select", label = h3("Select Variable"), 
        choices = unique(dfbb$variable), 
        selected = unique(dfbb$variable)[1]), 
     numericInput("num", label = h3("Replace * in A with"), 
        value = unique(dfbb$Value)[1]), 
     actionButton("applyChanges", "Apply Changes specified in B to A")), 
    mainPanel(
     h3("Table A"), dataTableOutput(outputId="tableA"), 
     h3("Table B"), dataTableOutput(outputId="tableB") 
))) 

server <- function(input, output) { 
    rv <- reactiveValues(dfA=dfaa,dfB=dfbb) 
    observe({ 
    # update dfB immediately when the variable or value in the ui changes 
    rv$dfB$Value[rv$dfB$variable==input$select] <- input$num 
    }) 

    observeEvent(input$applyChanges,{ 
    # Here we apply the changes that were specified 
    dfAcol <-as.character(rv$dfB$variable) 
    rv$dfA[dfAcol] <- 
      Map(function(x, y) replace(x, x=="*", y), rv$dfA[dfAcol], rv$dfB$Value) 
    }) 
    output$tableB <- renderDataTable({ rv$dfB }) 
    output$tableA <- renderDataTable({ rv$dfA }) 
} 
shinyApp(ui=ui,server=server) 

注:

  • それは実際にあなたが投稿元のコードにかなり近いです。
  • 私は前に述べた、あなたがしようとしたとして、私が代わりにeventReactivereactiveValuesobserveを使用したデータの更新を実装するには、あなたがeventReactiveでそれを行うことができ、私もそれを試してみましたが、この方法は クリーナーと明確だったと恐ろしい<<-を避けました。
  • 何が起こっているかを見るために、メインパネルに表Bを追加しました。
  • df2~dfaadf1~dfbbという名前を付けました。私はちょうどdf1を表Bとし、df2を表Aと同じように頭に入れておくと、あまりにも混乱しました。
  • 私はイニシャライザをもっと人間にやさしくしました - dput出力が読みにくいです。
  • mapinput$numの割り当ては、dplyrでより明確に行われます。私はdplyrを使用することをお勧めします。なぜなら、実際にはよりクリーンで、エラーを起こしにくいコードを作るためです。
  • 私はshinyAppコールからuiserver関数を引き出しました。これにより、より多くのインデントルームとより一般的なパターンが得られます。

必須のスクリーンショット:

enter image description here

+0

を使用する場合があります。私はRには新しく、まだコードを書くのに苦労しています。もう一度助けてくれてありがとう! –

+0

小さな質問です。 ui permanentで行われた変更をデータセットにコミットするオプションはありますか?地球環境の中でユーロ圏を閉鎖した後でも、その変化は見られるはずですか?ありがとうございます。 –

+0

はありません。サーバー部分で実行されるコードのみを書くことができます。ただし、observeEventに接続されたアクションボタンを組み合わせることを妨げるものはありません。次に、write.csvを目的のファイルにします。 –

関連する問題