R语言 如何创建一个从多个dfs中选择、编辑一个并下载编辑数据的Shiny应用程序

rryofs0p  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(129)

我试着创建一个闪亮的应用程序,在其中可以从不同的dfs中选择。然后可以编辑表中的值。最后我想下载编辑后的表。
每一步都是自己的,编辑和下载,选择和下载都没有问题。所有这三个一起:极度绝望。
我似乎不明白闪亮是如何更新React值的,以及你如何用隔离物切断它。

library(shiny)
library(DT)

ui <- fluidPage(
  
  # App title ----
  titlePanel("Downloading Data"),
  
  # Sidebar layout with input and output definitions ----
  sidebarLayout(
    
    # Sidebar panel for inputs ----
    sidebarPanel(
      
      # Input: Choose dataset ----
      selectInput("dataset", "Choose a dataset:",
                  choices = c("rock", "pressure", "cars"), multiple=T),
      actionButton(inputId   = "goButton",
                   label     = "Run Report"),
      
      # downloadbutton
      downloadButton("downloadData", "Download")
      
    ),
    
    # Main panel for displaying outputs ----
    mainPanel(
      DTOutput("x1")
    )
  )
)

#df <- cars #if this is taken instead of the first "eventReactive" it works

server <- function(input, output) {
   eventReactive({
    
    # Take a dependency on input$goButton
     input$goButton

    # Use isolate() to avoid dependency on input$obs
     df <-  isolate(input$dataset)
  })

  
  #render the editable DT
  
  output[["x1"]] <- renderDT({
    datatable(
      df,
      selection = "single", 
      editable = TRUE
    )
  })
  
  
  
  # Creating a DF with the edited info
  
  aniRoi2 <- reactiveVal(df)
  
  #Creating proxy
  
  proxy <- dataTableProxy("x1")
  
  #storing edited df in proxy
  
  observeEvent(input[["x1_cell_edit"]], { 
    info <- input[["x1_cell_edit"]]
    newAniroi2 <- 
      editData(aniRoi2(), info, proxy, rownames = TRUE, resetPaging = FALSE)
    aniRoi2(newAniroi2)
    saveRDS(newAniroi2, "data_entry_form.rds") # save rds
  })
  
  
  
  #download the proxy
  
  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(aniRoi2(), file)
    }
  )
  
  
}

shinyApp(ui, server)

在这里我尝试选择一个数据集,它只能通过按下一个按钮来加载。然后它应该像一个普通的数据。帧或tibble。
如果我排除选择 Dataframe 的可能性,并在“ui”和“server”之间调用“df〈-汽车”,那么它将按预期工作。
到目前为止,我收到错误消息:正在侦听http://127.0.0.1:4060警告:is_quosure中的错误:参数“表达式”错误(无标准)52:是引用51:预期目标50:事件React性49:服务器[#2] 3:运行应用程序2:打印.光泽.appobj 1:is_quosure(表达式)中出错:参数“表达式”错误(无标准)
非常感谢,任何帮助都将不胜感激。感觉好像我离得很近(但一周以来就是这样的感觉)。
我也尝试过download edited data table gives warning in shiny app,它使用observe来 Package 选择,但在shiny-app中我得到了熟悉的“错误'数据'必须是二维的(例如,数据框或矩阵)”
附言:如果你不介意的话,还有一个额外的问题:你如何调试shiny?我的意思是你怎么能看到里面发生了什么,环境看起来怎么样,哪些进程在工作?

5vf7fwbs

5vf7fwbs1#

您的代码有一些问题。首先,input$dataset是一个字符串,包含所选数据集的名称,而不是数据集本身。要获取数据集,请使用例如get(input$dataset)。其次,您使用eventReactive的方式很有趣。(;总的来说,我会选择一个observeEvent来初始化你的reactiveValaniRoi2,用选择的数据集。最后,我在你的selectInput中设置了multiple=FALSE,因为选择多个df会破坏你的代码,允许用户选择多个df对我来说毫无意义。(我猜你这样做是为了去掉预先选择的值??)

library(shiny)
library(DT)

ui <- fluidPage(
  titlePanel("Downloading Data"),
  sidebarLayout(
    sidebarPanel(
      selectInput("dataset", "Choose a dataset:",
        choices = c("rock", "pressure", "cars"), multiple = FALSE
      ),
      actionButton(
        inputId = "goButton",
        label = "Run Report"
      ),
      downloadButton("downloadData", "Download")
    ),
    mainPanel(
      DTOutput("x1")
    )
  )
)

server <- function(input, output) {
  aniRoi2 <- reactiveVal()
  
  observeEvent(input$goButton, {
    aniRoi2(get(input$dataset))
  })

  output[["x1"]] <- renderDT({
    datatable(
      aniRoi2(),
      selection = "single",
      editable = TRUE
    )
  })

  proxy <- dataTableProxy("x1")

  observeEvent(input[["x1_cell_edit"]], {
    info <- input[["x1_cell_edit"]]
    newAniroi2 <-
      editData(aniRoi2(), info, proxy, rownames = TRUE, resetPaging = FALSE)
    aniRoi2(newAniroi2)
  })

  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep = "")
    },
    content = function(file) {
      write.csv(aniRoi2(), file)
    }
  )
}

shinyApp(ui, server)

相关问题