我正在嘗試開發一個 R 閃亮的應用程式,它允許用戶使用 ggplot2 生成繪圖,同時還可以查看底層的 ggplot 代碼以幫助他們學習和習慣使用繪圖。我意識到我添加到這個應用程式的選項越多(例如主題、顏色、點大小等),我必須實作的 ifelse 陳述句就越多,因為不同繪圖型別的可能組合增加了。除了 if else 陳述句之外,還有更好的方法來編程這些可能性嗎?我想知道從長遠來看,增加這些陳述句的數量只會減慢應用程式的速度。
我正在使用 R 中可用的 iris 資料集,這是我到目前為止的代碼:
library(tidyverse)
library(shiny)
data(iris) # load data (already exists in base R)
ui = fluidPage(
titlePanel("Explore the Iris Data"),
sidebarLayout(
sidebarPanel(
selectInput("Species", label = "Choose Species",
choices = c(unique(as.character(iris$Species)), "All_species")),
selectInput("Trait1", label = "Choose Trait1",
choices = colnames(iris)[1:4]),
selectInput("Trait2", label = "Choose Trait2",
choices = colnames(iris)[1:4]),
selectInput("Theme_Choice", label = "Theme",
choices = c("Default", "Classic", "Black/White")),
sliderInput("pt_size",
label = "Point size",
min = 0.5, max = 10,
value = .4),
sliderInput("axis_sz",
label = "Axis title size",
min = 8, max = 30,
value = 1)
),
mainPanel(
plotOutput("Species_plot"),
verbatimTextOutput("code1"),
verbatimTextOutput("code2")
)
)
)
server = function(input,output) {
output$Species_plot = renderPlot({
if(input$Species == "All_species"){
df<-iris
p<-ggplot(data = df,
aes_string(x = input$Trait1, y = input$Trait2,
color = df$Species))
geom_point(size = input$pt_size)
theme(axis.title = element_text(size = input$axis_sz))
if(input$Theme_Choice == "Default"){
p<-ggplot(data = df,
aes_string(x = input$Trait1, y = input$Trait2,
color = df$Species))
geom_point(size = input$pt_size)
theme(axis.title = element_text(size = input$axis_sz))
}else{
if(input$Theme_Choice == "Classic"){
p<-ggplot(data = df,
aes_string(x = input$Trait1, y = input$Trait2,
color = df$Species))
geom_point(size = input$pt_size)
theme_classic()
theme(axis.title = element_text(size = input$axis_sz))
}else{
p<-ggplot(data = df,
aes_string(x = input$Trait1, y = input$Trait2,
color = df$Species))
geom_point(size = input$pt_size)
theme_bw()
theme(axis.title = element_text(size = input$axis_sz))
}
}
}else{
df<-iris %>%
filter(Species == input$Species)
p<-ggplot(data = df,
aes_string(x = input$Trait1, y = input$Trait2))
geom_point(size = input$pt_size)
theme(axis.title = element_text(size = input$axis_sz))
p
if(input$Theme_Choice == "Default"){
p
}else{
if(input$Theme_Choice == "Classic"){
p<-ggplot(data = df,
aes_string(x = input$Trait1, y = input$Trait2))
geom_point(size = input$pt_size)
theme_classic()
theme(axis.title = element_text(size = input$axis_sz))
}else{
p<-ggplot(data = df,
aes_string(x = input$Trait1, y = input$Trait2))
geom_point(size = input$pt_size)
theme_bw()
theme(axis.title = element_text(size = input$axis_sz))
}
}
}
})
output$code1 = renderText({
if(input$Species == "All_species"){
x_var<-as.character(input$Trait1)
y_var<-as.character(input$Trait2)
pt_s<-as.character(input$pt_size)
code<-"ggplot(data = iris,
aes(x = x_var,
y = y_var,
color = sp_var))
geom_point(size = pt_size)"
code<-gsub("x_var", x_var,code)
code<-gsub("y_var", y_var, code)
code<-gsub("pt_size", pt_s, code)
code<-gsub("sp_var", "Species", code)
}else{
x_var<-as.character(input$Trait1)
y_var<-as.character(input$Trait2)
pt_s<-as.character(input$pt_size)
species <- as.character(input$Species)
code<-"ggplot(data = iris %>% filter(Species == sp_var),
aes(x = x_var,
y = y_var))
geom_point(size = pt_size)"
code<-gsub("x_var", x_var,code)
code<-gsub("y_var", y_var, code)
code<-gsub("pt_size", pt_s, code)
code<-gsub("sp_var", shQuote(species), code)
}
#theme adjustment
if(input$Theme_Choice == "Default"){
code<-paste(code, " \ntheme(axis.title = element_text(size = axts))")
code<-gsub("axts", as.character(input$axis_sz), code)
code
}else{
if(input$Theme_Choice == "Classic"){
code<-paste(code, " \ntheme(axis.title = element_text(size = axts))")
code<-gsub("axts", as.character(input$axis_sz), code)
paste(code, " theme_classic()")
}else{
code<-paste(code, " \ntheme(axis.title = element_text(size = axts))")
code<-gsub("axts", as.character(input$axis_sz), code)
paste(code, " theme_bw()")
}
}
}
)
}
shinyApp(ui = ui, server = server)
uj5u.com熱心網友回復:
你閃亮的應用程式很冗長。
您應該為您要完成的任務創建一個函式,然后將這些函式傳遞給渲染函式。
我通過創建兩個函式來清理您的代碼,一個用于 plot myPlot,一個用于 text myText。我使用了glue包來插入字串和要使用的資料renderPrint。
library(tidyverse)
library(shiny)
library(glue)
myPlot <- function(data, x, y, ptsize, axsize) {
p <- ggplot(data = data, aes(x = .data[[x]], y = .data[[y]]))
geom_point(size = ptsize)
theme(axis.title = element_text(size = axsize))
return(p)
}
myText <- function(data, x, y, ptsize, axsize) {
myString <- glue("ggplot(data = data, aes(x = {x}, y = {y}))
geom_point(size = {ptsize})
theme(axis.title = element_text(size = {axsize}))")
return(myString)
}
ui = fluidPage(
titlePanel("Explore the Iris Data"),
sidebarLayout(
sidebarPanel(
selectInput("species", label = "Choose Species",
choices = c(unique(as.character(iris$Species)), "All_species")),
selectInput("trait1", label = "Choose Trait1",
choices = colnames(iris)[1:4]),
selectInput("trait2", label = "Choose Trait2",
choices = colnames(iris)[1:4]),
selectInput("theme_Choice", label = "Theme",
choices = c("Default", "Classic", "Black/White")),
sliderInput("pt_size",
label = "Point size",
min = 0.5, max = 10,
value = .4),
sliderInput("axis_sz",
label = "Axis title size",
min = 8, max = 30,
value = 1)
),
mainPanel(
plotOutput("Species_plot"),
verbatimTextOutput("code1"),
verbatimTextOutput("code2")
)
)
)
server <- function(input,output) {
data <- reactive(iris)
output$Species_plot <- renderPlot({
myPlot(data(), input$trait1, input$trait2, input$pt_size, input$axis_sz )
})
output$code1 <- renderPrint({
myText(data(), input$trait1, input$trait2, input$pt_size, input$axis_sz )
})
}
shinyApp(ui, server)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491419.html
