如何构建一个长的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)