#r #shiny
Вопрос:
Позвольте посмотреть следующее приложение.
Когда пользователь видит таблицу и нажимает на гиперссылку «B», я хотел бы перейти в раздел «Буквы» и выбрать там значение «B».
Как это можно сделать?
library(shiny)
library(DT)
library(data.table)
server <- function(input, output, session) {
output$uo_selector <- renderUI({
selectizeInput(
'si_letters', 'Letters',
choices = c("A", "B", "C"),
multiple = FALSE, selected = "A")
})
df_table <- reactive({
data.table(
letters = c(
paste0("<a href='Go to selector with value A'>", "A", "</a>"),
paste0("<a href='Go to selector with value B'>", "B", "</a>"),
paste0("<a href='Go to selector with value C'>", "C", "</a>")),
numbers = c(1, 2, 3)
)
})
output$dt_table <- renderDataTable(
df_table(), escape = FALSE, options = list(pageLength = 5))
}
ui <- fluidPage(
navbarPage('TEST',
tabPanel("Table",
fluidPage(
fluidRow(dataTableOutput("dt_table")))),
tabPanel("Letters",
fluidPage(
fluidRow(uiOutput("uo_selector"))))
)
)
# Run the application
shinyApp(ui, server)
Спасибо
Ответ №1:
Пожалуйста, проверьте следующий подход:
navbarPage
требуется идентификатор для программного выбора вкладкиsuspendWhenHidden = FALSE
чтобы вашrenderUI
звонок былselectizeInput
готов до того, как будет нажата первая ссылкаbindAll
блестящие теги для получения ссылки-нажмите черезobserveEvent
— Пожалуйста, ознакомьтесь с этим соответствующим ответом Джо Ченга.updateNavbarPage
иupdateSelectizeInput
library(shiny)
library(DT)
library(data.table)
ui <- fluidPage(
navbarPage('TEST', id = "navbarID",
tabPanel("Table",
fluidPage(
fluidRow(dataTableOutput("dt_table")))),
tabPanel("Letters",
fluidPage(
fluidRow(uiOutput("uo_selector"))))
)
)
server <- function(input, output, session) {
output$uo_selector <- renderUI({
selectizeInput(
'si_letters', 'Letters',
choices = c("A", "B", "C"),
multiple = FALSE, selected = "A")
})
outputOptions(output, "uo_selector", suspendWhenHidden = FALSE)
df_table <- reactive({
data.table(
letters = lapply(seq_len(3), function(i){as.character(actionLink(inputId = paste0("link_", LETTERS[i]), label = LETTERS[i]))}),
numbers = c(1, 2, 3)
)
})
lapply(seq_len(nrow(isolate(df_table()))), function(i){
observeEvent(input[[paste0("link_", LETTERS[i])]], {
updateNavbarPage(inputId = "navbarID", selected = 'Letters')
updateSelectizeInput(inputId = "si_letters", selected = LETTERS[i])
})
})
output$dt_table <- renderDataTable({
DT::datatable(
df_table(), escape = FALSE,
options = list(pageLength = 5,
preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ')
)
)
})
}
# Run the application
shinyApp(ui, server)