1

R Shiny では、反応値の特定のインスタンスをキャプチャして、そのインスタンスが完全に非反応になる方法はありますか? したがって、リアクティブな値で構成されたテーブルがあり、ユーザーが送信ボタンを押すと、それらの値が非リアクティブなテーブルにコピーされ、それを操作することができます。

したがって、次のコードでは、ユーザーがrhandsontableパッケージからテーブルに値を入力します(これは素晴らしいです)。私がやろうとしているのは、それを基本的なデータフレーム、つまり非反応でなければならないtabplotに変換することだけです。そして、その上であらゆるタイプの操作を行います。

library(shiny)
library(rhandsontable)

seq1 <- seq(1:6)
mat1 <- matrix(seq1, 2)

tabplot<-data.frame(car=numeric(2),num=numeric(2),truck=numeric(2))

did_recalc <- FALSE

ui <- fluidPage(
  rHandsontableOutput('table'),
  tableOutput('result'),
  tableOutput('kl'),
  textOutput('ca'),
  actionButton("goButton","Confirm"),

  actionButton("checkButton","Apply"),
  br(),
  actionButton("recalc", "Return to original values")

)

server <- function(input,output,session)({

  tabplot<-data.frame(car=numeric(2),num=numeric(2),truck=numeric(2))


  seq1 <- seq(1:6)
  mat1 <- matrix(seq1, 2)
  mat1<-data.frame(mat1)

  #creates reactive values for the data frame
  #obviously they have to be reactive values to function with the rhandsontable which is being continuously updated
  #as the documentation says "values taken from the reactiveValues object are reactive but the object itself is not
  values <- reactiveValues(data=mat1)

  #if recalc --- which connects to an action button in the ui is hit, values goes back to original data frame
  observe({
    input$recalc
    values$data<-mat1
  })

  #Where the magic happens
  output$table <- renderRHandsontable({
    rhandsontable(values$data,selectCallback = TRUE)
  })

  #this changes the handsontable format to an r object
  observe({
    if(!is.null(input$table))
      values$data <-hot_to_r(input$table)
  })

  #Here we create a reactive function that creates a data frame of the rhandsontable output but it is a reactive function
  fn<-reactive({
    co<-data.frame((values$data))                                
    return(co)
  })

  #Bit of testing, this demonstrates that the fn() is only updated after the button is pressed
  output$result<-renderTable({
    input$goButton
    isolate({
      fn()
    })
  })   

  isolate({
#  tabplot<-reactive({                              #Format co[desired row:length(colums)][desired column] 
    tabplot[1,1:3][1]<-fn()[1,1:3][1]
    tabplot[1,1:3][2]<-fn()[1,1:3][2]
    tabplot[1,1:3][3]<-fn()[1,1:3][3]

    tabplot[2,1:3][1]<-fn()[2,1:3][1]
    tabplot[2,1:3][2]<-fn()[2,1:3][2]
    tabplot[2,1:3][3]<-fn()[2,1:3][3]
  })

  output$kl<-renderTable({

    tabplot

  })  


  observe({
    input$goButton
    output$ca<-renderText({
      tabplot$car 
      cat('\nAccessing Subset with $:', tabplot$car)
      cat('\nAccessing specific cell:',tabplot[1,3])
      cat('\noperations on specific cell:',tabplot[1,3]*2)
    })
  })



})
shinyApp(ui = ui, server = server)
4

1 に答える 1

1

これはあなたが望むものかもしれません。これは非常に軽蔑されている<<-演算子を利用していますが、これは、shiny の「怠惰なリアクティブ」アーキテクチャを覆す必要があるときに私が行うことです。

注: 並列データフレームを設定しtabplot1、表示する場所の下に表示しますtabplot

library(shiny)
library(rhandsontable)

seq1 <- seq(1:6)
mat1 <- matrix(seq1, 2)

tabplot<-data.frame(car=numeric(2),num=numeric(2),truck=numeric(2))

did_recalc <- FALSE

ui <- fluidPage(
  rHandsontableOutput('table'),
  tableOutput('result'),
  tableOutput('kl'),
  tableOutput('kl1'),
  textOutput('ca'),
  actionButton("goButton","Confirm"),

  actionButton("checkButton","Apply"),
  br(),
  actionButton("recalc", "Return to original values")

)

server <- function(input,output,session)({

  tabplot<-data.frame(car=numeric(2),num=numeric(2),truck=numeric(2))
  tabplot1 <- tabplot


  seq1 <- seq(1:6)
  mat1 <- matrix(seq1, 2)
  mat1<-data.frame(mat1)

  #creates reactive values for the data frame
  #obviously they have to be reactive values to function with the rhandsontable which is being continuously updated
  #as the documentation says "values taken from the reactiveValues object are reactive but the object itself is not
  values <- reactiveValues(data=mat1)

  #if recalc --- which connects to an action button in the ui is hit, values goes back to original data frame
  observe({
    input$recalc
    values$data<-mat1
  })

  #Where the magic happens
  output$table <- renderRHandsontable({
    rhandsontable(values$data,selectCallback = TRUE)
  })

  #this changes the handsontable format to an r object
  observe({
    if(!is.null(input$table))
      values$data <-hot_to_r(input$table)
  })

  #Here we create a reactive function that creates a data frame of the rhandsontable output but it is a reactive function
  fn<-reactive({
    co<-data.frame((values$data))                                
    return(co)
  })

  #Bit of testing, this demonstrates that the fn() is only updated after the button is pressed
  output$result<-renderTable({
    input$goButton
    tabplot1 <<- data.frame(values$data)
    colnames(tabplot1) <<- colnames(tabplot)
    isolate({
      fn()
    })
  })   

  isolate({
    #  tabplot<-reactive({                              #Format co[desired row:length(colums)][desired column] 
    tabplot[1,1:3][1]<-fn()[1,1:3][1]
    tabplot[1,1:3][2]<-fn()[1,1:3][2]
    tabplot[1,1:3][3]<-fn()[1,1:3][3]

    tabplot[2,1:3][1]<-fn()[2,1:3][1]
    tabplot[2,1:3][2]<-fn()[2,1:3][2]
    tabplot[2,1:3][3]<-fn()[2,1:3][3]
  })

  output$kl<-renderTable({

    tabplot

  })  
  output$kl1<-renderTable({
    input$goButton
    tabplot1

  })  



  observe({
    input$goButton
    output$ca<-renderText({
      tabplot$car 
      cat('\nAccessing Subset with $:', tabplot$car)
      cat('\nAccessing specific cell:',tabplot[1,3])
      cat('\noperations on specific cell:',tabplot[1,3]*2)
    })
  })



})
shinyApp(ui = ui, server = server)

収量:

ここに画像の説明を入力

于 2016-05-23T17:38:54.950 に答える