提问人:JohnBones JohnBones 提问时间:1/21/2023 更新时间:1/21/2023 访问量:41
如何在 Shiny 中使用从主文件到模块文件的输入值
How to use inputs values from main file to module file in Shiny
问:
我正在改进和改变我的问题。
此代码执行以下操作
一旦我点击链接的名称,它的名字就会从模块发送到 h1 标签内的模块显示:
这是我的模块代码:
example_UI <- function(id) {
ns <- NS(id)
tagList(
htmlOutput(ns('name_from_main'))
)
}
example_Server <- function(id, names) {
moduleServer(
id,
function(input, output, session) {
output$name_from_main <- renderUI({
h1(names())
})
}
)
}
我的主要应用程序代码是这样的:
ui <- fluidPage(
names(mtcars)[1:4] %>% map(~ actionLink(label = paste0(.x),
inputId = paste0(.x))),
example_UI('example')
)
server <- function(input, output, session) {
object <- reactive({
if(input$mpg != 0){
"MPG"
}else{
if(input$hp != 0){
"HP"
}else{
if(input$cyl != 0){
"cyl"
}else{
"others"
}
}
}
})
example_Server("example", names = object )
}
shinyApp(ui, server)
我的问题是它不完整。一旦我点击链接,它就会第一次改变。并且不显示其他链接名称 波纹 管。
我认为问题出在对象变量上。
有什么帮助吗?
答:
2赞
jpdugo17
1/21/2023
#1
名称仅更新一次的原因与以下事实有关:只要按下一次 mpg 链接,该输入的关联值将在应用程序生命周期的剩余时间内变为零。
缓解这种情况的一种方法是为每个链接设置一个观察者,并使用单个 reactiveVal 来存储最后一个按下的链接的信息。
server <- function(input, output, session) {
name <- reactiveVal("OTHERS")
observeEvent(input$mpg, {
name("MPG")
})
observeEvent(input$cyl, {
name("CYL")
})
observeEvent(input$disp, {
name("DISP")
})
observeEvent(input$hp, {
name("HP")
})
# pass reactiveVal as the names argument
example_Server("example", names = name)
}
另一种选择是使用另一种输入来更轻松地捕获不同的值。在这种情况下,input$name 将包含从输入中最后选择的值。
ui <- fluidPage(
shinyWidgets::radioGroupButtons(
inputId = "name",
label = "",
choices = names(mtcars)[1:4],
status = "primary",
individual = TRUE
),
example_UI("example")
)
server <- function(input, output, session) {
example_Server(
id = "example",
names = reactive(toupper(input$name))
)
}
shinyApp(ui, server)
评论