如何在闪亮的服务器功能中复制无功值 [英] how to make a copy of a reactive value in shiny server function

查看:40
本文介绍了如何在闪亮的服务器功能中复制无功值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个Shiny应用程序,并以该问题中的代码为例:

I am building a Shiny app and using the code from this question as an example: How to download editable data table in shiny. However, in my code the df <- reactiveVal(dat) does not work, because the dat itself is already a reactive value that comes from an eventReactive({}) function. This is the code I am working with, it works if I define the dat outside of the server, but not when it is created inside the server function of shiny. How do I make a copy of it so that I can show it in a new table (and potentially process further and download in later steps in the app)?

library(shiny)
library(DT)
library(shinyWidgets)


# if the data frame is just an object, it works
#dat <- iris[1:3, ]

ui <- fluidPage( actionBttn(
  inputId = "btnProcess",
  label = "Process",
  size = "sm",
  color = "success"
),
  DTOutput("my_table"),
  DTOutput("table2")
  
)

server <- function(input, output){
  
  
  # if the dataframe is a reactive variable, this doesnt work.
  dat <- eventReactive(input$btnProcess, {
    iris[1:3, ]
  })
  
  
  output[["my_table"]] <- renderDT({
    datatable(dat(), editable = "cell")
  })
  
  
  #############################
  #### none of these work #####
  #############################
  
  #df <- reactiveVal(dat)
  #df <- reactiveVal(dat())
  #df <- dat()
  #df <- dat
  
  
  observeEvent(input[["my_table_cell_edit"]], {
    cell <- input[["my_table_cell_edit"]]
    newdf <- df()
    newdf[cell$row, cell$col] <- cell$value
    df(newdf)
  })
  
  
  output[["table2"]] <- renderDT({
    datatable(df())
  })
  
  
}

shinyApp(ui, server)

推荐答案

尝试一下

ui <- fluidPage( actionBttn(
  inputId = "btnProcess",
  label = "Process",
  size = "sm",
  color = "success"
), 
actionBttn(inputId = "reset", label = "Reset", size="sm", color="warning"),
DTOutput("mytable"),
DTOutput("table2")

)

server <- function(input, output){
  
  
  # if the dataframe is a reactive variable, this doesnt work.
  dat <- eventReactive(input$btnProcess, {
    iris[1:3, ]
  })
  
  mydf <- reactiveValues(data=NULL)
  
  observe({
    mydf$data <- dat()
  })
  
  output$mytable <- renderDT({
    datatable(mydf$data, editable = "cell")
  })
  
  observeEvent(input$mytable_cell_edit, {
    info = input$mytable_cell_edit
    str(info)
    i = info$row
    j = info$col
    v = info$value
    
    mydf$data[i, j] <<- DT::coerceValue(v, mydf$data[i, j])
    
  })
  
  output[["table2"]] <- renderDT({
    datatable(mydf$data)
  })
  
  observeEvent(input$reset, {
    mydf$data <- dat()   ## reset it to original data
  })
  
}

shinyApp(ui, server)

这篇关于如何在闪亮的服务器功能中复制无功值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆