我有一个R Shiny,其中server.R
输出大量动态生成的UI对象。
我认为我可以使用bs_accordion()
包中的bsplus而不是处理input
中的数百个对象。
我希望bs_accordion()
通过server.R
对象将其控制的元素的状态报告回input
。
我的计划是使用renderUI()
仅针对当前选定的项目动态生成UI元素。
很不幸,据我所知,bsplus
包中没有任何东西放入input
中。
以下内容在浏览器控制台中有效(假设手风琴元素为MYACCORDION
)...
MYACCORDION.onclick=function(){
Shiny.onInputChange('SELECTED_DIV',document.getElementsByClassName('in')[0].getElementsByClassName('shiny-input-container')[0].id
}
... in
显然是bs类给出了手风琴中当前选择的元素,并且总是只有一个。因此,执行此操作后,只要选择了新内容,input$SELECTED_DIV
就会得到更新。
但是我不能以编程方式执行上述操作。我尝试将其放在tags$script(...)
末尾的fluidPage()
中,但它没有附加到div上。我还尝试通过div(...,onclick=FOO)
内联插入它,但是onclick
的值在输出中被转义并且不解释为文本。
onclick
中插入ui.R
函数的正确位置在哪里?onclick
属性的值视作原样,而不转义符号?onclick
事件上?谢谢。
答案 0 :(得分:1)
我建议设置一个虚拟输入,该输入将保留所选选项卡的当前值(在这种情况下为文本)。
这可能会帮助您:
library(shiny)
library(bsplus)
shinyApp(
ui = fluidPage(
tags$script("$(function() {
$('#meet_the_beatles a').on('click', function(x) {
Shiny.onInputChange('selected_tab', x.target.innerText)
});
});"),
fluidRow(
column(
width = 6,
offset = 3,
bs_accordion(id = "meet_the_beatles") %>%
bs_append(title = "John", content = "Rhythm guitar, vocals") %>%
bs_append(title = "Paul", content = "Bass guitar, vocals") %>%
bs_append(title = "George", content = "Lead guitar, vocals") %>%
bs_append(title = "Ringo", content = "Drums, vocals")
)
),
HTML("<input id='selected_tab' type='text' style='display: none;'")
),
server = function(input, output, session) {
observe({
print(paste("The selected tab is", input$selected_tab))
})
}
)