R блестящий: выбор обновлений на основе реактивного фрейма данных

#r #shiny #reactive

#r #блестящий #реактивный

Вопрос:

У меня есть блестящее приложение, в котором пользователь фильтрует столбец статьи моего набора данных в зависимости от статей, которые он хочет видеть. Затем эти статьи отображаются в таблице. Статьи реагируют как actionbutton с пользовательской функцией при нажатии. Я хочу, чтобы всякий раз, когда пользователь нажимает на определенную статью, эта статья выбиралась в selectInput . Тем не менее, я понятия не имею, какое значение передавать selected атрибуту updateSelectInput .

Я поставил три вопросительных знака в том месте, где я застрял. При удалении трех вопросительных знаков код становится исполняемым. Любая помощь приветствуется

 library(shiny)
library(tidyverse)
library(kableExtra)
library(formattable)

df = tibble(article=c("one", "two", "three", "four", "five", "six"),
            group=c("a", "a", "a", "b", "b", "b"),
            sales=c(12,13,14,43,50,45))

ui = fluidPage(
    
    sidebarPanel(
        radioButtons(inputId = "select_a", label = "Choose a group", choices = unique(df$group), selected = "a"),
        htmlOutput(outputId = "table")),
    
    sidebarPanel(
        selectInput(inputId = "select_b", label = "Choose an article", choices = df$article, selected = "one")
    )
    
)

server = function(input, output, session){
    
    shinyInput <- function(FUN, len, id, labels, ...) {
        inputs <- character(len)
        for (i in seq_len(len)) {
            inputs[i] <- as.character(FUN(paste0(id, i), label = labels[i], ...))
        }
        inputs
    }
    
    df_reactive = reactive({
        df %>% filter(group == input$select_a) %>%
            mutate(article = shinyInput(actionButton, n(), 'button_', labels = article, onclick = 'Shiny.onInputChange("select_button", this.id)'))
    })
    
    output$table = function(){
        df_reactive() %>%
            kable("html", escape = F, align = "c") %>%
            kable_styling(bootstrap_options = c("striped", "condensed", "responsive"), full_width = F, position = "center") %>%
            scroll_box(width = "100%", height = "auto")
    }
    
    observeEvent(input$select_button, {
        updateSelectInput(session = session, inputId = "select_b", selected = ???)
    })
    
    
}

shinyApp(ui = ui, server = server)
  

Ответ №1:

Возможно, вы можете использовать this.innerText для извлечения статьи здесь:

 mutate(article = shinyInput(actionButton, n(), 'button_', labels = article, 
                            onclick = 'Shiny.onInputChange("select_button", this.innerText)'))
  

И затем input$select_button будет содержать текстовую строку для select :

 updateSelectInput(session = session, inputId = "select_b", selected = input$select_button) 
  

Комментарии:

1. Это работает отлично, и я искал что-то подобное, но поскольку я совсем не знаком с Javascript, я бы никогда не смог придумать решение. Было бы здорово, если бы вы могли немного уточнить this.innerText , чтобы я правильно понял, что здесь происходит.

2. @lucaskr innerText Свойство является «отображаемым» простым текстом HTML-элемента. Обычно это был бы текст, который вы получили бы, выделив содержимое элемента курсором и скопировав. В этом случае это будет текстовая метка кнопки. Когда вы динамически создаете кнопки, которые у вас есть <button class = "btn"...>labelhere</button> , поэтому «labelhere» будет текстом, возвращаемым из this.innerText .