如何构建一个长的selectInput列表,然后使用它来更改facet\u wrap中的标签

如何构建一个长的selectInput列表,然后使用它来更改facet\u wrap中的标签,r,ggplot2,shiny,R,Ggplot2,Shiny,这个问题是关于 上面的问题是关于更改镶嵌面包裹的标签的,答案是完美-->将修改后的标签添加为数据集的新列 现在,我面临的问题是-- 用户选择多个变量selectInput(“选择”,h4(“变量”),choices=var.both1(),selected=var.both1()[1],multiple=T,width=“100%” (对于EX:让我们考虑输入$选择< /代码>长度可以是6) 现在,input$select包含六个变量,我想检查每个变量并为其分配单位,我可以通过以下反应组件部分实

这个问题是关于

上面的问题是关于更改镶嵌面包裹的标签的,答案是完美-->将修改后的标签添加为数据集的新列

现在,我面临的问题是--

用户选择多个变量
selectInput(“选择”,h4(“变量”),choices=var.both1(),selected=var.both1()[1],multiple=T,width=“100%”

(对于EX:让我们考虑<代码>输入$选择< /代码>长度可以是6) 现在,

input$select
包含六个变量,我想检查每个变量并为其分配单位,我可以通过以下反应组件部分实现这一点

variableunit <- reactive ({
  if(input$select == "TEPC") {"degC"}
  else if(input$select == "AT"){"µmol/kg"}
  else if(input$select == "DIC" | input$select == "DIN" | input$select == "PIC" | input$select == "POC" | input$select == "PON" | input$select == "POP" | input$select == "DOC" | input$select == "DON" | input$select == "DOP" | input$select == "TEP"){c("µmol/L")}
  else if(input$select == "Chla"){"µg/L"}
  else ("Meters")  
})
要上载的文件

只需复制粘贴代码并执行它

现在问题解决了 是第一个变量单位,对所有其他绘图重复。我知道这就是我用来得到变量单位的无功分量的问题

问题 现在是,如何做到这一点

我被困在这里很久了,真希望有人知道解决办法。谢谢。

Q:“如何在variableunit中列出6个值,以便在下面的ggplot方面使用它?”

答:在反应函数中可以有6个值的列表。使用for循环遍历
输入$select
。并将对应单元保存到列表中的同一索引中

server <- function(input, output) {

      variableunit <- reactive({
      test <- c("TEPC", "Chla", "DIN", "PIC", "AI", "PON")    
      values <- list()
      for(i in 1:length(test)) {

        if(test[[i]] == "TEPC") {
        values[[i]] <-"degC"
        }else if(test[[i]] == "AT"){
        values[[i]] <-"µmol/kg"
        }else if(test[[i]] == "DIC" | test[[i]] == "DIN" | test[[i]] == "PIC" | test[[i]] == "POC" | test[[i]] == "PON" | test[[i]] == "POP" | test[[i]] == "DOC" | test[[i]] == "DON" | test[[i]] == "DOP" | test[[i]] == "TEP"){
        values[[i]] <-"µmol/L"
        }else if(test[[i]] == "Chla"){
        values[[i]] <-"µg/L"
        }else{
        values[[i]] <-"Meters"
        }   
    }

  return(paste(as.character(test), "(",values,")", sep=""))
})

      output$text <- renderText({
        variableunit()
        print(paste(variableunit()))
      })
    }

    ui <- shinyUI(fluidPage(
      sidebarLayout(
        sidebarPanel(

        ),
        mainPanel(textOutput("text"))
      )
    ))

    shinyApp(ui = ui, server = server)

server我尝试了上面的答案,最终得到了这个错误“错误:nrow*ncol>=n不是真的”。如果有人知道周围的工作,请告诉我

server <- function(input, output) {


  #File Upload
  a <- reactive({
    fileinput1 <- input$file1
    if (is.null(fileinput1))
      return(NULL)
    read.table(fileinput1$datapath, header = TRUE, col.names = c("Ei","Mi","hours","Nphy","Cphy","CHLphy","Nhet","Chet","Ndet","Cdet","DON","DOC","DIN","DIC","AT","dCCHO","TEPC","Ncocco","Ccocco","CHLcocco","PICcocco","par","Temp","Sal","co2atm","u10","dicfl","co2ppm","co2mol","pH"))
  })


  #Plot
  output$showMapPlot <- renderUI({
{ list(plotOutput("plot",height="100%"), br()) }
  })


  #Variable Input
  output$select <- renderUI({
    if(!is.null(a())){selectInput("select", h4("Variables:"), choices=names(a())[-c(1,2,3)], selected=NULL, multiple=T, width="100%")}
  })




  #Function to plot the variables
  plot_4 <- function(var1 = input$select[1], var2 = input$select[2], var3 = input$select[3], var4 = input$select[4], var5 = input$select[5], var6 = input$select[6]) {
    myvars <- c(var1,var2,var3,var4,var5,var6)
    withProgress(message = 'Processing please wait...', value = 0, {
    gg4 <- aggregate(cbind(get(var1),get(var2),get(var3),get(var4),get(var5),get(var6))~Mi+hours,a(), FUN=mean)
    names(gg4)[3] <- var1
    names(gg4)[4] <- var2
    names(gg4)[5] <- var3
    names(gg4)[6] <- var4
    names(gg4)[7] <- var5
    names(gg4)[8] <- var6
    dd <- melt(gg4,id.vars=c("Mi","hours"), measure.vars=myvars)


    #Reactive element to get the unit corresponding to the variable entered
    variableunit <- reactive({
      test <- c("TEPC", "Chla", "DIN", "PIC", "AI", "PON")    
      values <- list()
      for(i in 1:length(test)) {

        if(test[[i]] == "TEPC") {
          values[[i]] <-"degC"
          next
        }else if(test[[i]] == "AT"){
          values[[i]] <-"µmol/kg"
          next
        }else if(test[[i]] == "DIC" | test[[i]] == "DIN" | test[[i]] == "PIC" | test[[i]] == "POC" | test[[i]] == "PON" | test[[i]] == "POP" | test[[i]] == "DOC" | test[[i]] == "DON" | test[[i]] == "DOP" | test[[i]] == "TEP"){
          values[[i]] <-"µmol/L"
        }else if(test[[i]] == "Chla"){
          values[[i]] <-"µg/L"
        }else{
          values[[i]] <-"Meters"
        }
      }

      return(values)
      #return(paste(as.character(test), "(",values,")", sep=""))
      #dd$label <- paste(as.character(test), "(",values,")", sep="")
    })

    print(paste(variableunit()))
    dd$label <- paste(as.character(dd$variable), "(", variableunit(), ")", sep="")
    #dd$label <- variableunit()

    print(names(dd))
    #print(unique(dd$variable))
    #print(unique(dd$value))
    print(ggplot(dd,aes(x=hours, y=value)) + 
            geom_point(aes(color=factor(Mi)), size = 3, position = position_jitter(width = 0.1))  +
            geom_smooth(stat= "smooth" , alpha = I(0.01), method="loess", color = "blue") +
            facet_wrap(~label, nrow=3, ncol=2,scales = "free_y") + scale_color_discrete("Mesocosm") )
})
  }

  output$plot <- renderPlot({
    if(length(input$select) == 6){
    plot_4() 
    }
},
height=700, width=1100
)
}

ui <- shinyUI(fluidPage(
  fluidRow(column(3,
      uiOutput("showMapPlot"),
      wellPanel(
        h4("Data Upload"),
        fileInput('file1', h5('Choose Your Model Data'), accept=c('text/csv','text/comma-separated-values,text/plain','.OUT'))),
      wellPanel(h4("Variable selection"),uiOutput("select"))

    ),
    column(9,
           tabsetPanel(
             tabPanel("Conditional Plots",plotOutput("plot",height="auto"),value="barplots"),
             id="tsp"))
  )
))

shinyApp(ui = ui, server = server)

server您是否尝试使用
reactiveValues()
?例如:
values@MikaelJumppanen这很好。但是ggplot一旦得到所有六个变量就开始绘图…所以如果input$select最终有6个值,那么在这种情况下我如何处理上述方法。(最终,根据用户选择的6个值,我如何在variableunit中拥有6个值的列表?)在
selectInput()
中,一次只选择一个变量,input$select将返回该选择的值。但reactivevalues()应该有用户输入的所有6个变量的列表。我已经添加了关于此的完整github。请查收。您可以选择“选项2”(使用单个变量,它会更改面精细的标签)和“选项3”(使用6个变量,这里面标签与第一个变量和绘图值重复,我知道原因,但无法正确处理)如果您遵循以下指导原则,回答起来会容易得多:谢谢……生成单元后,我必须将它们更新为相应的变量……这是我尝试使用粘贴来完成的(如.character(dd$variable),“(”,(variableunit(),”),sep=“”)但我将以错误告终:nrow*ncol>=n不是真的抱歉@statisticalbeginner,您没有使用@突出显示我,所以我没有注意到您的评论。如果我修改我对
返回的答案(粘贴(如字符(测试),“(”,值“)”,sep=”“)
它会打印:TEPC(degC)Chla(µg/L)DIN(µmol/L)PIC(µmol/L)AI(Meters)PON(µmol/L)这就是你想要的吗?错误是因为你的函数
variableunit
只返回一个变量。在我的回答中,我修改了函数,使其返回列表…谢谢…在您的示例中,它可以工作…但我正在尝试将单位更新为数据集“dd”中名为label的列…我得到了错误,因为我可以读取单个变量,但不能读取相应的单个单位…我必须找到一种方法来获取与变量对应的单个单位,并更新数据集“dd”中名为label的新列…这样,如果我在facet_wrap中使用此更新的数据集,我将得到我需要的结果。
server <- function(input, output) {


  #File Upload
  a <- reactive({
    fileinput1 <- input$file1
    if (is.null(fileinput1))
      return(NULL)
    read.table(fileinput1$datapath, header = TRUE, col.names = c("Ei","Mi","hours","Nphy","Cphy","CHLphy","Nhet","Chet","Ndet","Cdet","DON","DOC","DIN","DIC","AT","dCCHO","TEPC","Ncocco","Ccocco","CHLcocco","PICcocco","par","Temp","Sal","co2atm","u10","dicfl","co2ppm","co2mol","pH"))
  })


  #Plot
  output$showMapPlot <- renderUI({
{ list(plotOutput("plot",height="100%"), br()) }
  })


  #Variable Input
  output$select <- renderUI({
    if(!is.null(a())){selectInput("select", h4("Variables:"), choices=names(a())[-c(1,2,3)], selected=NULL, multiple=T, width="100%")}
  })




  #Function to plot the variables
  plot_4 <- function(var1 = input$select[1], var2 = input$select[2], var3 = input$select[3], var4 = input$select[4], var5 = input$select[5], var6 = input$select[6]) {
    myvars <- c(var1,var2,var3,var4,var5,var6)
    withProgress(message = 'Processing please wait...', value = 0, {
    gg4 <- aggregate(cbind(get(var1),get(var2),get(var3),get(var4),get(var5),get(var6))~Mi+hours,a(), FUN=mean)
    names(gg4)[3] <- var1
    names(gg4)[4] <- var2
    names(gg4)[5] <- var3
    names(gg4)[6] <- var4
    names(gg4)[7] <- var5
    names(gg4)[8] <- var6
    dd <- melt(gg4,id.vars=c("Mi","hours"), measure.vars=myvars)


    #Reactive element to get the unit corresponding to the variable entered
    variableunit <- reactive({
      test <- c("TEPC", "Chla", "DIN", "PIC", "AI", "PON")    
      values <- list()
      for(i in 1:length(test)) {

        if(test[[i]] == "TEPC") {
          values[[i]] <-"degC"
          next
        }else if(test[[i]] == "AT"){
          values[[i]] <-"µmol/kg"
          next
        }else if(test[[i]] == "DIC" | test[[i]] == "DIN" | test[[i]] == "PIC" | test[[i]] == "POC" | test[[i]] == "PON" | test[[i]] == "POP" | test[[i]] == "DOC" | test[[i]] == "DON" | test[[i]] == "DOP" | test[[i]] == "TEP"){
          values[[i]] <-"µmol/L"
        }else if(test[[i]] == "Chla"){
          values[[i]] <-"µg/L"
        }else{
          values[[i]] <-"Meters"
        }
      }

      return(values)
      #return(paste(as.character(test), "(",values,")", sep=""))
      #dd$label <- paste(as.character(test), "(",values,")", sep="")
    })

    print(paste(variableunit()))
    dd$label <- paste(as.character(dd$variable), "(", variableunit(), ")", sep="")
    #dd$label <- variableunit()

    print(names(dd))
    #print(unique(dd$variable))
    #print(unique(dd$value))
    print(ggplot(dd,aes(x=hours, y=value)) + 
            geom_point(aes(color=factor(Mi)), size = 3, position = position_jitter(width = 0.1))  +
            geom_smooth(stat= "smooth" , alpha = I(0.01), method="loess", color = "blue") +
            facet_wrap(~label, nrow=3, ncol=2,scales = "free_y") + scale_color_discrete("Mesocosm") )
})
  }

  output$plot <- renderPlot({
    if(length(input$select) == 6){
    plot_4() 
    }
},
height=700, width=1100
)
}

ui <- shinyUI(fluidPage(
  fluidRow(column(3,
      uiOutput("showMapPlot"),
      wellPanel(
        h4("Data Upload"),
        fileInput('file1', h5('Choose Your Model Data'), accept=c('text/csv','text/comma-separated-values,text/plain','.OUT'))),
      wellPanel(h4("Variable selection"),uiOutput("select"))

    ),
    column(9,
           tabsetPanel(
             tabPanel("Conditional Plots",plotOutput("plot",height="auto"),value="barplots"),
             id="tsp"))
  )
))

shinyApp(ui = ui, server = server)
server <- function(input, output) {


  #File Upload
  a <- reactive({
    fileinput1 <- input$file1
    if (is.null(fileinput1))
      return(NULL)
    read.table(fileinput1$datapath, header = TRUE, col.names = c("Ei","Mi","hours","Nphy","Cphy","CHLphy","Nhet","Chet","Ndet","Cdet","DON","DOC","DIN","DIC","AT","dCCHO","TEPC","Ncocco","Ccocco","CHLcocco","PICcocco","par","Temp","Sal","co2atm","u10","dicfl","co2ppm","co2mol","pH"))
  })


  #Plot
  output$showMapPlot <- renderUI({
{ list(plotOutput("plot",height="100%"), br()) }
  })


#Variable Input
output$select <- renderUI({
  if(!is.null(a())){selectInput("select", h4("Variables:"), choices=names(a())[-c(1,2,3)], selected=NULL, multiple=T, width="100%")}
})

#Reactive Element to update the units
variableunit <- reactive({
  #test <- c("TEPC", "Chla", "DIN", "PIC", "AI", "PON")    
  test <- input$select
  values <- list()
  for(i in 1:length(test)) {

    if(test[[i]] == "TEPC") {
      values[[i]] <-"degC"
      next
    }else if(test[[i]] == "AT"){
      values[[i]] <-"µmol/kg"
      next
    }else if(test[[i]] == "DIC" | test[[i]] == "DIN" | test[[i]] == "PIC" | test[[i]] == "POC" | test[[i]] == "PON" | test[[i]] == "POP" | test[[i]] == "DOC" | test[[i]] == "DON" | test[[i]] == "DOP" | test[[i]] == "TEP"){
      values[[i]] <-"µmol/L"
    }else if(test[[i]] == "Chla"){
      values[[i]] <-"µg/L"
    }else{
      values[[i]] <-"Meters"
    }
  }

  return(values)
})



#Function to plot the variables
plot_4 <- function(var1 = input$select[1], var2 = input$select[2], var3 = input$select[3], var4 = input$select[4], var5 = input$select[5], var6 = input$select[6]) {
  myvars <- c(var1,var2,var3,var4,var5,var6)
  withProgress(message = 'Processing please wait...', value = 0, {
    gg4 <- aggregate(cbind(get(var1),get(var2),get(var3),get(var4),get(var5),get(var6))~Mi+hours,a(), FUN=mean)
    names(gg4)[3] <- paste(var1,"(",variableunit()[1],")")
    names(gg4)[4] <- paste(var2,"(",variableunit()[2],")")
    names(gg4)[5] <- paste(var3,"(",variableunit()[3],")")
    names(gg4)[6] <- paste(var4,"(",variableunit()[4],")")
    names(gg4)[7] <- paste(var5,"(",variableunit()[5],")")
    names(gg4)[8] <- paste(var6,"(",variableunit()[6],")")
    dd <- melt(gg4,id.vars=c("Mi","hours"), measure.vars=c(names(gg4)[3],names(gg4)[4],names(gg4)[5],names(gg4)[6],names(gg4)[7],names(gg4)[8]))

    print(ggplot(dd,aes(x=hours, y=value)) + 
            geom_point(aes(color=factor(Mi)), size = 3, position = position_jitter(width = 0.1))  +
            geom_smooth(stat= "smooth" , alpha = I(0.01), method="loess", color = "blue") +
            facet_wrap(~variable, nrow=3, ncol=2,scales = "free_y") + scale_color_discrete("Mesocosm") )
  })
}

output$plot <- renderPlot({
  if(length(input$select) == 6){
    plot_4() 
  }
},
height=700, width=1100
)
}

ui <- shinyUI(fluidPage(
  fluidRow(column(3,
                  uiOutput("showMapPlot"),
                  wellPanel(
                    h4("Data Upload"),
                    fileInput('file1', h5('Choose Your Model Data'), accept=c('text/csv','text/comma-separated-values,text/plain','.OUT'))),
                  wellPanel(h4("Variable selection"),uiOutput("select"))

  ),
  column(9,
         tabsetPanel(
           tabPanel("Conditional Plots",plotOutput("plot",height="auto"),value="barplots"),
           id="tsp"))
  )
))

shinyApp(ui = ui, server = server)