r - 在 navbarPage 的选项卡中重用 ouputs$xxx
问题描述
我对 Shiny 相当陌生——尤其是如何使代码紧凑并避免重复。为了简化我的问题(下面的代码):我想使用 navbarPage,因为我喜欢它提供的概述。
在每个选项卡中,我想在主面板中显示一个绘图,这取决于来自侧面板的输入,而侧面板又取决于选项卡。但是由于现在允许在多个位置调用相同的输出,这会导致重复,如下面的代码所示。
所以我的问题是解决这个问题的方法是什么,同时仍然使用标签。非常感谢您的帮助和新年快乐!
#test
library(shiny)
plot_fun_helper <- function(x,y){
plot(x,y, type = 'l')
}
#function that returns the x- and y vektors for plotting, not important.
xy_dens_gen <- function(tab, input){
if(tab == "Normal"){
#if normal, plot around mean, pm 3 std
x <- seq(from = input$normal_mean - 3*input$normal_std,
to = input$normal_mean + 3*input$normal_std,
length.out = 1e3)
y <- dnorm(x, mean = input$normal_mean, sd = input$normal_std)
}
else if(tab == "LogNormal"){
#if LogNormal, plot from 0 to 3*CV
x <- seq(from = 0,
to = 3*input$lognormal_CV,
length.out = 1e3)
y <- dlnorm(x, meanlog = 0, sdlog = 1)
}
else if(tab =="Exponential"){
x <- seq(from = 0,
to = 3/input$exp_rate,
length.out = 1e3)
y <- dexp(x, rate = input$exp_rate)
}
else stop("No method found")
return(list(x = x,
y = y))
}
# Define UI for application that draws the pdf
ui <-
navbarPage(
title = 'reprex', id = "cur_tab", selected = 'Normal',
# Normal Tab ----
navbarMenu("Normal/LogNormal",
tabPanel("Normal",
sidebarLayout(
sidebarPanel(
sliderInput(inputId = "normal_mean", "Choose mean", value = 1, min = -2 , max = 2),
sliderInput(inputId = "normal_std" , "Choose std" , value = 1, min = 0 , max = 2)
),
mainPanel(
plotOutput("plot_normal")
)
)
),
tabPanel("LogNormal",
sidebarLayout(
sidebarPanel(
sliderInput(inputId = "lognormal_CV", "Choose CV", value = 1, min = 0 , max = 20)
),
mainPanel(
plotOutput("plot_LogNormal")
)
)
)
),
# exponential Tab
tabPanel('Exponential',
sidebarLayout(
sidebarPanel(
sliderInput(inputId = "exp_rate", "Choose rate", value = 1, min = 0, max = 10)
),
mainPanel(
plotOutput("plot_exp")
)
)
)
)
# Define server logic required to draw pdf
server <- function(input, output) {
rvals <- reactiveValues()
observe({
rvals$x <- xy_dens_gen(tab = input$cur_tab, input = input)$x
rvals$y <- xy_dens_gen(tab = input$cur_tab, input = input)$y
})
#Render print inside renderPLot
output$plot_normal <- renderPlot({
plot_fun_helper(x = rvals$x, y = rvals$y)
})
output$plot_LogNormal <- renderPlot({
plot_fun_helper(x = rvals$x, y = rvals$y)
})
output$plot_exp <- renderPlot({
plot_fun_helper(x = rvals$x, y = rvals$y)
})
}
# Run the application
shinyApp(ui = ui, server = server)
解决方案
据我所知,没有。不同的选项卡将需要不同的输出 ID。你可能会用一个闪亮的模块来掩盖这个事实,但在某个地方,在某种程度上,你将分配给 3 个不同的输出。
推荐阅读
- azure - Azure B2C MFA 电话号码格式中发现的错误(缺少空格)
- c# - 如何将滚动输入定向到 ScrollView?[统一]
- flutter - 从 assets 文件夹加载 html 并使用 webview_flutter 包添加查询参数
- php - Sql查询从填充日期获取行
- azure - 如何从数组变量 [fileName 和 FileContent] 创建一个 zip 文件。使用 azure 函数或 Azure 逻辑应用程序(没有任何第三方服务)
- python - Python PyTorch 在多个线程中执行,内存不足并被操作系统杀死
- java - 使用 java.util.logging -> log4j2 -> Tomcat 的 JULI 时记录级别不正确
- jquery - Bootstrap 旋转木马不滑动
- javascript - 如果对象内的所有值都相同且为 false 或 true,则更改变量值
- json - 在没有数组键的情况下在 Swift 中解析 JSON