【问题标题】:How to get data out of reactive function in Shiny to create new columns on the same DF如何从 Shiny 中的反应函数中获取数据以在同一个 DF 上创建新列
【发布时间】:2016-11-22 21:20:33
【问题描述】:

在我下面的脚本中,Shiny 作为响应函数从 PostgresSQL 获取数据,我想操作该响应函数的输出(就像我们在数据框中所做的那样),然后我可以将它传递给 renderPlot函数来获得我想要的输出。

如果能帮助我了解如何使其工作,我将不胜感激。我没有包含错误消息,因为我认为在处理反应函数时发生了错误。

感谢您的帮助!高度赞赏。

#server side operation

library(shiny)
library(dplyr)
library(ggplot2)
library(DBI)
library(RPostgreSQL)

drv <- dbDriver("PostgreSQL")
con <-dbConnect(drv,dbname = "", host = "valid credentials", port = 5439,
           user = "USER", password = "password")

dates <- seq(as.Date(as.character(Sys.Date() - 33)), as.Date(as.character(Sys.Date() - 1)), by = 1)


shinyServer(function(input, output, session)  {

generate <- function(dates){

listofdfs <- list() #Create a list in which you intend to save your df's. 

for (i in 1:length(dates)){



data <- reactive({dbGetQuery(con, sprintf("select Column A, CAST (date AS date), id from My_Table 
                                       where id =", input$user_id," and
                                       date <= '%s' and date >= '%s'- INTERVAL '7 days'", dates[i], dates[i]))


data$Column_A_mean <- mean(data[,1]) #creating a new column like we do in a data frame (DF)
  })

 listofdfs[[i]] <- data() # save your dataframes into the list
 }

return(listofdfs) #Return the list of dataframes.
}


df <- do.call("rbind", generate(dates))

output$Coolplot <- renderPlot({
ggplot(data = df, aes(date)) +
  geom_line(aes(y = Column A, colour = "Column A"))+
  geom_line(aes(y = Column_A_mean, colour = "Column_A_mean"))
     })

  })

【问题讨论】:

  • 你不能把反应式放在循环中,而是在反应式中放一个循环。
  • 嗨@HubertL ...再次感谢您的回复....您能告诉我,为什么我需要将反应函数放入循环中,以及如何添加另一列到反应函数返回的 df....谢谢

标签: r shiny


【解决方案1】:

你必须把reactive放到函数之外,例如你可以从reactive调用函数:

shinyServer(function(input, output, session)  {

  generate <- function(dates){
    listofdfs <- list() #Create a list in which you intend to save your df's. 
    for (i in 1:length(dates)){
      data <- dbGetQuery(con, sprintf("select Column A, CAST (date AS date), id from My_Table 
                                                where id =", input$user_id," and
                                                date <= '%s' and date >= '%s'- INTERVAL '7 days'", dates[i], dates[i]))
      data$Column_A_mean <- mean(data[,1]) #creating a new column like we do in a data frame (DF)
      listofdfs[[i]] <- data() # save your dataframes into the list
    }
    return(listofdfs) #Return the list of dataframes.
  }

  df <- reactive({do.call("rbind", generate(dates))})

  output$Coolplot <- renderPlot({
    ggplot(data = df(), aes(date)) +
      geom_line(aes(y = Column A, colour = "Column A"))+
      geom_line(aes(y = Column_A_mean, colour = "Column_A_mean"))
  })

})

【讨论】:

  • @HubertL...感谢您的回答并帮助我了解“如何将反应式放入循环”。感谢您上次的帮助!...非常感谢...:)
  • @HubertL...我一直坚持一个问题,如果您能提供帮助将不胜感激...我不断收到错误“ggplot2 不知道如何处理类矩阵的数据”... .知道为什么会这样吗?
  • 改用as.data.frame(do.call... 试试
  • 谢谢...我想这可行,因为我不再收到该错误但现在我收到其他错误。即使browse()此时也没有帮助....再次感谢您的回复!...非常感谢您的帮助:)
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
相关资源
最近更新 更多