R将变量从选择列表传递到反应性绘图

R将变量从选择列表传递到反应性绘图,r,ggplot2,shiny,R,Ggplot2,Shiny,我用闪亮的包装做了第一次尝试,太棒了。但是,像往常一样,我面临着一些问题。我根据闪亮的教程和谷歌搜索,成功地显示了两个不同气象站的不同图,但都显示了相同的变量 我想添加另一个输入列表,以便可以选择要绘制的var。当试图运行脚本时,它似乎运行时没有任何错误,但没有显示绘图,只有选择菜单。 可能将变量传递给server.R时出错,因此输出对象图没有正确构建,只是猜测而已。试图以一种通用的方式根据输入变量创建函数,但我遗漏了一些东西,可能是关于反应性,可能是正确地传递变量 这些是ui.R的代码

我用闪亮的包装做了第一次尝试,太棒了。但是,像往常一样,我面临着一些问题。我根据闪亮的教程和谷歌搜索,成功地显示了两个不同气象站的不同图,但都显示了相同的变量

我想添加另一个输入列表,以便可以选择要绘制的var。当试图运行脚本时,它似乎运行时没有任何错误,但没有显示绘图,只有选择菜单。

可能将变量传递给server.R时出错,因此输出对象图没有正确构建,只是猜测而已。试图以一种通用的方式根据输入变量创建函数,但我遗漏了一些东西,可能是关于反应性,可能是正确地传递变量

这些是ui.R的代码

    library("shiny")
shinyUI(pageWithSidebar(

  headerPanel('Comparación de zonas - Temperatura'),

  sidebarPanel(
    selectInput("panel1", "Zona:",
                           list("Zona 1" = "1", 
                                "Zona 2" = "2", 
                                "Zona 3" = "3",
                                "Zona 4" = "4")),
    selectInput("panel2", "Zona:",
                list("Zona 1" = "1", 
                     "Zona 2" = "2", 
                     "Zona 3" = "3",
                     "Zona 4" = "4")),
    selectInput("var", "Variable:",
                list("tempc" = "tempc", 
                     "relhum" = "relhum")),    
  helpText('Al seleccionar la zona se crearán automáticamente
   el gráfico de evolución temporal.')
  ),

  mainPanel(
    conditionalPanel(condition = "inputId == 'panel1'",plotOutput('myplot')
    ),
    conditionalPanel(condition = "inputId == 'panel2'",plotOutput("myplot")
    )    
  )  
))
和服务器.R

    library(shiny)
library(plyr)
library(ggplot2)

shinyServer(function(input, output) {

  formulaText <- reactive(function() {
    paste("Gràfica de ggplot: Zona ", input$zona1)
  })

  # Return the formula text for printing as a caption
  output$caption <- reactiveText(function() {
    formulaText()
  })

  # datasets
  datos=read.table("data.dat",header=T)
  data=as.data.frame(datos)
  data=within(data, datetime <- as.POSIXct(paste(date, time),format = "%Y%m%d %H%M%S"))

  rams <- reactive({ 
    subset(data,data$stat_id %in% places$stat_id[places$Zona == input$panel1])    
  })  


  plot <- function(var) {
    p <- ggplot(rams(),aes(x=datetime, y=var, colour=as.character(stat_id))) +
      geom_line()
  } 

  plot=p(input$var)

  if(input$var == "tempc") {
    plot <- plot + ylab("Temperatura (ºC)") + xlab(" ") +
      ggtitle(gtitol) + theme(legend.title=element_blank()) +    theme(legend.position="bottom") +
      scale_y_continuous(limits = c(-20,ylim),breaks=c(seq(-20,ylim,by=2))) }

  if (input$var == "relhum") {
    plot <- plot + 
      ylab("Humedad relativa (%)") + xlab(" ") +  
      ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") + 
      scale_y_continuous(limits = c(0,100),breaks=c(seq(0,100,by=5))) }

  output$myplot <- reactivePlot(function() {
    print(plot)
  })  

})
库(闪亮)
图书馆(plyr)
图书馆(GG2)
shinyServer(功能(输入、输出){

formulaText我终于成功了。问题在于变量从ui.R输入传递到server.R的方式以及ggplot如何处理这些输入。我不得不使用aes_字符串来管理变量名。现在,第一个选择列表允许选择上/下绘图中使用的数据帧,第三个选择变量到be通过创建不同的ggplot命令进行打印

虽然脚本目前正在运行,但仍存在一些问题,需要优化代码,使其能够以更通用的方式运行。我通过对较大的数据帧进行子集设置来构造两个不同的数据帧,可能最好只有一个和子集。我定义了两个绘图输出(myplot1和myplot2)因为我找不到如何管理两个条件面板中的一个。仍然有工作,但作为shiny的新手,我很高兴它正在运行

在任何情况下,我附上为我工作的代码,希望它能帮助某人:

用户界面

服务器.R

library(shiny)
library(plyr)
library(ggplot2)

shinyServer(function(input, output) {

  datos=read.table("data.dat",header=T)
  pobles=read.table("pobles-zona.dat",header=T)

  data=as.data.frame(datos)
  places=as.data.frame(pobles)

  data$time[data$time == "0"] = "000000"
  data$time[data$time == "10000"] = "010000"
  data$time[data$time == "20000"] = "020000"
  data$time[data$time == "30000"] = "030000"
  data$time[data$time == "40000"] = "040000"
  data$time[data$time == "50000"] = "050000"
  data$time[data$time == "60000"] = "060000"
  data$time[data$time == "70000"] = "070000"
  data$time[data$time == "80000"] = "080000"
  data$time[data$time == "90000"] = "090000"

  data=within(data, datetime <- as.POSIXct(paste(date, time),format = "%Y%m%d %H%M%S"))

  formulaText <- reactive(function() {
    paste("Gràfica de ggplot: Zona ", input$panel1, input$panel2, input$var)
  })

  # Return the formula text for printing as a caption
  output$caption <- reactiveText(function() {
    formulaText()
  })

  rams1 <- reactive({ 
    subset(data,data$stat_id %in% places$stat_id[places$Zona == input$panel1])    
  })  
  rams2 <- reactive({ 
    subset(data,data$stat_id %in% places$stat_id[places$Zona == input$panel2])    
  })  

  p <- function(data){
  p=ggplot(data(),aes_string(x="datetime", y=input$var,colour="as.character(stat_id)")) +
    geom_line()  
  }

   output$myplot1 <- reactivePlot(function() {

    gtitol=paste("Zona ",input$panel1)
    yx=round(max(rams1()$tempc)+2)
    yn=round(min(rams1()$tempc)-2)

    plot=p(rams1) 

    if ( input$var == "tempc" ) {
      plot=plot + ylab("Temperatura (ºC)") + xlab(" ") +
      ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
      scale_y_continuous(limits = c(yn,yx),breaks=c(seq(yn,yx,by=2)))
   }

    if ( input$var == "relhum"  ){
      plot=plot + ylab("Humedad relativa (%)") + xlab(" ") +  
      ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") + 
      scale_y_continuous(limits = c(0,100),breaks=c(seq(0,100,by=5)))
    }
    print(plot)
  })

  output$myplot2 <- reactivePlot(function() {

      gtitol=paste("Zona ",input$panel2)
      yx=round(max(rams2()$tempc)+2)
      yn=round(min(rams2()$tempc)-2)     

      plot=p(rams2) 

      if ( input$var == "tempc" ) {
        ylim=max(rams2()$tempc)+2
        plot=plot + ylab("Temperatura (ºC)") + xlab(" ") +
        ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
        scale_y_continuous(limits = c(yn,yx),breaks=c(seq(yn,yx,by=2)))
      }
      if ( input$var == "relhum"  ) {
        ylim=100
        plot=plot + ylab("Humedad relativa (%)") + xlab(" ") +  
        ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") + 
        scale_y_continuous(limits = c(0,100),breaks=c(seq(0,100,by=5)))
      }
    print(plot)
  })
})
库(闪亮)
图书馆(plyr)
图书馆(GG2)
shinyServer(功能(输入、输出){
datos=read.table(“data.dat”,header=T)
pobles=read.表格(“pobles分区数据”,标题=T)
data=as.data.frame(datos)
places=as.data.frame(pobles)
数据$time[数据$time==“0”]=“000000”
数据$time[数据$time==“10000”]=“010000”
数据$time[数据$time==“20000”]=“020000”
数据$time[数据$time==“30000”]=“030000”
数据$time[数据$time==“40000”]=“040000”
数据$time[数据$time==“50000”]=“050000”
数据$time[数据$time==“60000”]=“060000”
数据$time[数据$time==“70000”]=“070000”
数据$time[数据$time==“80000”]=“080000”
数据$time[数据$time==“90000”]=“090000”

data=in(data,datetime
plot=p(input$var)
是错误的是,但这不是唯一的问题。请参阅下面的答案。谢谢。很高兴知道
aes\u string()
,谢谢您发布此答案。
library(shiny)
library(plyr)
library(ggplot2)

shinyServer(function(input, output) {

  datos=read.table("data.dat",header=T)
  pobles=read.table("pobles-zona.dat",header=T)

  data=as.data.frame(datos)
  places=as.data.frame(pobles)

  data$time[data$time == "0"] = "000000"
  data$time[data$time == "10000"] = "010000"
  data$time[data$time == "20000"] = "020000"
  data$time[data$time == "30000"] = "030000"
  data$time[data$time == "40000"] = "040000"
  data$time[data$time == "50000"] = "050000"
  data$time[data$time == "60000"] = "060000"
  data$time[data$time == "70000"] = "070000"
  data$time[data$time == "80000"] = "080000"
  data$time[data$time == "90000"] = "090000"

  data=within(data, datetime <- as.POSIXct(paste(date, time),format = "%Y%m%d %H%M%S"))

  formulaText <- reactive(function() {
    paste("Gràfica de ggplot: Zona ", input$panel1, input$panel2, input$var)
  })

  # Return the formula text for printing as a caption
  output$caption <- reactiveText(function() {
    formulaText()
  })

  rams1 <- reactive({ 
    subset(data,data$stat_id %in% places$stat_id[places$Zona == input$panel1])    
  })  
  rams2 <- reactive({ 
    subset(data,data$stat_id %in% places$stat_id[places$Zona == input$panel2])    
  })  

  p <- function(data){
  p=ggplot(data(),aes_string(x="datetime", y=input$var,colour="as.character(stat_id)")) +
    geom_line()  
  }

   output$myplot1 <- reactivePlot(function() {

    gtitol=paste("Zona ",input$panel1)
    yx=round(max(rams1()$tempc)+2)
    yn=round(min(rams1()$tempc)-2)

    plot=p(rams1) 

    if ( input$var == "tempc" ) {
      plot=plot + ylab("Temperatura (ºC)") + xlab(" ") +
      ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
      scale_y_continuous(limits = c(yn,yx),breaks=c(seq(yn,yx,by=2)))
   }

    if ( input$var == "relhum"  ){
      plot=plot + ylab("Humedad relativa (%)") + xlab(" ") +  
      ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") + 
      scale_y_continuous(limits = c(0,100),breaks=c(seq(0,100,by=5)))
    }
    print(plot)
  })

  output$myplot2 <- reactivePlot(function() {

      gtitol=paste("Zona ",input$panel2)
      yx=round(max(rams2()$tempc)+2)
      yn=round(min(rams2()$tempc)-2)     

      plot=p(rams2) 

      if ( input$var == "tempc" ) {
        ylim=max(rams2()$tempc)+2
        plot=plot + ylab("Temperatura (ºC)") + xlab(" ") +
        ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") +
        scale_y_continuous(limits = c(yn,yx),breaks=c(seq(yn,yx,by=2)))
      }
      if ( input$var == "relhum"  ) {
        ylim=100
        plot=plot + ylab("Humedad relativa (%)") + xlab(" ") +  
        ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") + 
        scale_y_continuous(limits = c(0,100),breaks=c(seq(0,100,by=5)))
      }
    print(plot)
  })
})