【问题标题】:Editing data frame after reactive upload in R shiny在 R Shiny 中反应上传后编辑数据框
【发布时间】:2019-05-15 02:00:50
【问题描述】:

我正在尝试编辑我使用 fileInput 上传的数据框 yjay 中的列,但是我不断收到错误消息“在没有活动的反应性上下文的情况下不允许操作。(您尝试做一些只能从反应性内部完成的事情)表达或观察者。)”。有人知道我为什么会收到这个错误吗?任何帮助都非常学徒!

server = function(input, output) {

  a1 = reactive({
    if(is.null(input$myFile$datapath)) NULL
    else{
      read_excel(input$myFile$datapath)
    }
  })


  x <- as.POSIXct(a1()$Month)

  a1()$mo <- strftime(x, "%m")
  a1()$yr <- strftime(x, "%Y")
  a1()$qrt <- quarter(x, with_year = FALSE, fiscal_start = 01)

  #subsetting data to display sales reps that hold a quota 

  newdata <- a1()[grepl("Y", a1()$`Quota Held Flag`),]

  #fixing participation column into categorical for donut chart
  newdata$Participation[is.na(newdata$Participation)] <- 0
  newdata$Participation <- factor(newdata$Participation, labels = 
                                    c("0-99%","100%")) 

  #grouping data
  newdata2 <- newdata %>%
    group_by(yr, mo, qrt) 
}
shinyApp(ui = ui, server = server)

【问题讨论】:

  • 您需要在响应式环境中调用a1()。您希望所有代码何时运行设置moyrqrt 值?我认为这需要在 myFile 更新的任何时候发生。您可以将这些转换移动到a1 反应值中,或者创建一个新的反应值,例如依赖于a1newdata。如果您是 Shiny 的新手,可以查看 these videos 以了解响应式编程的基础知识。
  • 感谢您对@MrFlick 的帮助!我对闪亮还是很陌生,所以我无法理解你在反应环境中调用 a1() 的意思。你认为你可以举一个简短的例子吗?另外,我很欣赏视频链接,肯定会在圣诞假期深入了解这些链接。
  • @JohnPaul 你是说使用 a1 = reactiveDataInput 而不仅仅是反应式?
  • 我想我的想法是,一旦您阅读了 a1,就不要尝试更改它。相反,根据 a1 和 mo、yr 和 qrt 作为列的更改创建一些新的响应式 data.frame。

标签: r shiny shinydashboard shiny-reactivity


【解决方案1】:

server() 函数中的代码实际上应该只设置响应式对象并响应响应式事件。您不应该在 server() 函数本身的主体中包含任何数据操作数据,因为当它运行时,数据尚不可用。这样的事情更有意义

ui <- fluidPage(
  fluidPage(
    titlePanel("Uploading Files"),
    fileInput('myFile', 'Choose File'),
    tableOutput('contents')
  )
)
server <- function(input, output) {

  a1 <- reactive({
    req(input$myFile)
    read_excel(input$myFile$datapath)
  })

  newdata <- reactive({
    a1 <- a1()
    x <- as.POSIXct(a1$Month)

    a1$mo <- strftime(x, "%m")
    a1$yr <- strftime(x, "%Y")
    a1$qrt <- quarter(x, with_year = FALSE, fiscal_start = 01)

    newdata <- a1[grepl("Y", a1$`Quota Held Flag`),]

    #fixing participation column into categorical for donut chart
    newdata$Participation[is.na(newdata$Participation)] <- 0
    newdata$Participation <- factor(newdata$Participation, labels = c("0-99%","100%")) 

    #grouping data
    newdata %>%
      group_by(yr, mo, qrt)     
  })

  output$contents <- renderTable(        
    newdata()        
  )

}
shinyApp(ui = ui, server = server)

注意a1 如何读取用户上传的文件。然后newdata 反应对象将在a1 更新时更新,并为您转换数据。然后我们可以将它连接到输出,以便实际处理它。

【讨论】:

  • 这有助于更好地绘制图片,非常感谢!因此,当从上传的文件中调用数据时,我应该调用 newdata(),而不是 a1()?
  • 好吧,如果您想要原始数据,请使用a1(),这正是用户上传的内容。但如果您想应用所有更改和过滤器,请使用newdata()。它们都将存在并工作,它们只会包含不同的东西。这一切都取决于你最终想用它们做什么。
  • 一切顺利,感谢所有新见解!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2016-11-30
  • 2020-02-12
  • 2020-12-20
  • 2015-08-07
  • 2018-01-23
  • 2018-11-01
相关资源
最近更新 更多