library(shiny)
library(palmerpenguins)
library(ggplot2)
library(dplyr)
penguin <- penguins
penguin$year <- as.factor(penguin$year)
ui <- fluidPage(
titlePanel("Data Visualisation of Penguins Data"),
sidebarPanel(
selectInput("yaxis",
label = "Choose a y-axis variable to display",
choices = list("bill_length_mm",
"bill_depth_mm",
"flipper_length_mm",
"body_mass_g"),
selected = "bill_length_mm"),
selectInput("xaxis",
label = "Choose a x-axis variable to display",
choices = c("species",
"sex",
"year"),
selected = "sex"),
checkboxGroupInput("islandlevels",
label = "Check to display different island levels",
choices = c("island"),
selected = NULL),
br(), br(),
selectInput("species",
label = "Choose species to view separate plot",
choices = list("Adelie",
"Chinstrap",
"Gentoo"),
selected = NULL)),
mainPanel(
plotOutput("plot1"),
br(), br(),
plotOutput("plot2")
)
)
server <- function(input, output){
output$plot1 <- renderPlot({
if(is.null(penguin))
return(NULL)
ggplot(penguin, aes(x = penguin[[input$xaxis]], y = penguin[[input$yaxis]])) +
geom_boxplot()
})
}
shinyApp(ui = ui, server = server)
这是我的闪亮代码,但是当x轴变量为性别时,我想删除NA值。我不能只删除具有NA值的行,因为当我更改x轴变量或/和y轴变量时,必须使用变量(不丢失值,但该行具有丢失的值,例如图像2中的第9行)。 。我想找到解决方案,但我想知道应该使用什么功能。我必须使用if语句,反应函数还是其他?
预先感谢您的帮助。
有条件地过滤数据,也许是这样的:
dat <- reactive({
if (input$xaxis == "sex") penguin[ !is.na(penguin$sex), ] else penguin
})
output$plot1 <- renderPlot({
req(penguin, input$xaxis, input$yaxis)
ggplot(dat(), aes_string(x = isolate(input$xaxis), y = input$yaxis)) +
geom_boxplot()
})
这里有几个重要的变化:
如果您想对过滤后的数据做更多的绘图,那么我将创建一个反应性数据组件,命名dat
为过滤后的数据。这样,如果您曾经添加(说)一张表或另一幅图或某物,则无需对它们中的每一个进行选择性过滤,只需要在dat()
任何地方使用,一切都会从中受益。
反应性可能是易变的,并且对数据和绘图都做出反应input$xaxis
将导致对的每次更改都会绘制两次绘图xaxis
。因此,我isolate(input$xaxis)
在情节中反应迟钝。当用户更改时xaxis
,dat
将会更改,这将触发(一次!)绘图更改。(无需隔离yaxis,因为在这种情况下是正确的。)
通常,您不应使用ggplot2(x, aes(x$a, x$b))
。更具体地说,在主题定义中使用$
和/或[[
在主题aes
定义中使用是不好的做法,在某些情况下会失败。aes
与符号(例如,cyl
来自mtcars)或aes_string
字符串("cyl"
)一起使用会更好。由于您是通过编程定义美学的,因此最好使用aes_string
。
我将您更改if (is.null(penguin))
为Shiny的更具规范性req
,并在输入中也添加了检查。尽管大多数更简单的闪亮应用程序并不总是需要此功能,但我发现更复杂的应用程序可能会导致输入实例化延迟足够长,以至于输出反应性块可能会在分配所有输入之前触发,这意味着在此示例中可能为input$xaxis
null。虽然不太可能在像这样的简单闪亮应用程序中使用,但我仍然认为它是安全的。
可能有理由使用单独的req
行,每个输入一行。在这种情况下,结果将是相同的,但有时将它们分开是有意义的。
使用req
禁止其余图的渲染,但也可以通过闪亮的组件识别,而不引起错误或渲染问题。(我更喜欢手动if (is.null(.)) return(NULL)
逻辑。)
注意:我认为@stefan的答案可能是从轴上ggplot2
省略NA
值的更规范的方法,因此也许这是解决问题的最佳方法。但是,我仍然相信,即使进行了Stefan的更改,第3点和第4点仍然(也)与您的应用程序相关。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句