我正在尝试从Shiny模块内部访问最后单击的复选框或按钮ID。
我发现这篇帖子的出色回答很有帮助:R shiny - last clicked button id,并将代码修改为我的问题。我还从这篇文章中得到了一个提示:https://github.com/datastorm-open/visNetwork/issues/241,但仍然无法正常工作。
user_inputUI <- function(id){
# Create a namespace function using the provided id
ns <- NS(id)
tagList(
tags$head(tags$script(HTML("$(document).on('click', '.needed', function () {
Shiny.onInputChange('", ns("last_btn"), "', this.id);
});"))),
tags$span(HTML('<div><input id="first" type="checkbox" class="needed"></div>')),
actionButton(ns("second"), "Second",class="needed"),
actionButton(ns("third"), "Third",class="needed"),
actionButton(ns("save"), "save"),
selectInput(ns("which_"),"which_",c("first","second","third"))
)
}
update_options <- function(input, output, session) {
observeEvent(input$save,{
updateSelectInput(session,"which_",selected = input$last_btn)
})
return(reactive(input$last_btn))
}
ui <- shinyUI(fluidPage(
titlePanel("Track last clicked Action button"),
sidebarLayout(
sidebarPanel(
user_inputUI("link_id")
),
mainPanel(
textOutput("lastButtonCliked")
)
)
))
server <- shinyServer(function(input, output,session) {
last_id <- callModule(update_options, "link_id")
output$lastButtonCliked=renderText({last_id()})
})
# Run the application
shinyApp(ui = ui, server = server)
我希望输入$ last_btn值(单击的最后一个按钮的ID名称)在应用程序底部创建并返回,并在selectize中成为更新的输入。但是,未创建input $ last_btn,我也已使用调试browser()对此进行了检查。
答案 0 :(得分:0)
您快到了,但是还有一些小的格式化问题。更新的代码在下面列出。
您主要是用逗号分隔HTML
的方式滥用JS
(我将其更改为ns("last_btn")
,但这不是问题)。如果您检查了原始HTML(...)
语句的输出,您会发现生成的JavaScript字符串为
Shiny.onInputChange(' link_id-last_btn ', this.id);
我的意思是输入id周围的空格。由于存在多余的空格,因此输入未正确映射到input$last_btn
上。在示例中,我使用了paste0
将字符串正确地粘在一起。
第二,我纠正了一些遗漏的ns
呼叫,但是一旦输入阻止程序消失,您肯定会发现自己。
user_inputUI <- function(id){
# Create a namespace function using the provided id
ns <- NS(id)
tagList(
tags$head(
tags$script(
JS(paste0("$(document).on('click', '.needed', function () {debugger;
Shiny.onInputChange('", ns("last_btn"), "', this.id);
});"))
)
),
tags$span(HTML(paste0('<div><input id="', ns("first"), '" type="checkbox" class="needed"></div>'))),
actionButton(ns("second"), "Second", class="needed"),
actionButton(ns("third"), "Third", class="needed"),
actionButton(ns("save"), "save"),
selectInput(ns("which_"), "which_", c(ns("first"), ns("second"), ns("third")))
)
}
update_options <- function(input, output, session) {
observeEvent(input$last_btn, {
print(input$last_btn)
})
observeEvent(input$save, {
updateSelectInput(session, "which_", selected = input$last_btn)
})
return(reactive(input$last_btn))
}
ui <- shinyUI(fluidPage(
titlePanel("Track last clicked Action button"),
sidebarLayout(
sidebarPanel(
user_inputUI("link_id")
),
mainPanel(
textOutput("lastButtonCliked")
)
)
))
server <- shinyServer(function(input, output,session) {
last_id <- callModule(update_options, "link_id")
output$lastButtonCliked=renderText({last_id()})
})
# Run the application
shinyApp(ui = ui, server = server)