【问题标题】:reactive updates in shiny app - one-way dependence闪亮应用程序中的反应更新 - 单向依赖
【发布时间】:2016-04-10 11:09:17
【问题描述】:

previous 反应式更新问题中,@NicE 帮助我了解它是如何工作的。然而,这里还有另一个问题。根据我的代码(包括在下面),每次我更改 radioButtons 小部件时,selectInput 小部件中的值会自动返回到 id 值,即使我不想这样做。例如,当我更改L1 -> L3 然后更改Ordering -> Part name 然后我想转到L3 -> L2 时,selectInput 小部件会自动回到@987654332 @。我知道为什么会发生这种情况,但是是否有任何解决方案可以实施以避免这种自动化(当然,如果没有必要 - 尽管在L3 -> L1 中不可避免地移动)。谢谢!

ui.R

library(shiny)

shinyUI(
        fluidPage(
                fluidRow(
                        column(3,
                               selectInput('prod','', prod),
                               radioButtons('level','',level, level[1]),
                               uiOutput('in_xvar')
                        ),
                        column(9,
                               ggvisOutput('ggvis_plot')
                        )
                )
        ))

server.R

library(shiny)
library(ggvis)
library(dplyr)


shinyServer(function(input, output) {

        data0 <- reactive({
                df <- test_data
                df <- df %>% 
                        filter(prod == input$prod)
        })

        data <- reactive({
                df <- data0()
                df <- df %>% 
                        filter(level == input$level)
        })

        output$in_xvar <- renderUI({
                choosen_list <- axis_x[input$level]
                selectInput('xvar','', choosen_list)
        })

        ggvis_plot <- reactive({
                if (is.null(input$xvar))
                        x <- prop('x', as.name("id"))
                else 
                        x <- prop('x', as.name(input$xvar))

                plot <- data() %>% 
                        ggvis(x, ~value) %>% 
                        layer_points(fill = ~part)
        })

        ggvis_plot %>% bind_shiny('ggvis_plot')
})

global.R

prod <- c('P1','P2','P3')
level <- c('L1','L2','L3')
part <- c('p1','p2','p3','p4','p5')

axis_x <- list(L1 = list('Ordering' = 'id'),
               L2 = list('Ordering' = 'id', 'Part name' = 'part'),
               L3 = list('Ordering' = 'id', 'Part name' = 'part'))

set.seed(123)
test_data <- data.frame(prod = sample(prod,300, replace = T), 
           level = sample(level, 300, replace = T), 
           part = sample(part, 300, replace = T),
           value = rnorm(300))

test_data <- test_data %>% 
        group_by(prod) %>% 
        mutate(id = 1:n()) %>% 
        arrange(prod, id)

【问题讨论】:

  • 您可以使用函数isolate() shiny.rstudio.com/articles/isolation.html来隔离调用
  • 是的,我知道这一点,但在这种特殊情况下,我不知道该怎么做。我尝试了几种选择。问题更复杂,因为selectInput 小部件依赖于input$level

标签: r shiny ggvis


【解决方案1】:

我不确定我是否完全理解您的问题。 但是,如果问题是在您选择另一个单选按钮后第三个下拉框会切换其值,则此代码应该会有所帮助

output$in_xvar <- renderUI({
  choosen_list <- axis_x[input$level]
  selectInput('xvar','', choosen_list,selected=input$xvar)
})

【讨论】:

  • 如此简单!太棒了,越简单的解决方案越好:) 我寻找更复杂的方法。谢谢!
  • 我也先尝试了一些更复杂的方法;)
猜你喜欢
  • 2016-04-09
  • 2019-01-10
  • 2021-01-20
  • 2018-07-10
  • 2017-07-27
  • 2017-03-10
  • 2021-12-05
  • 2018-03-24
  • 2017-12-05
相关资源
最近更新 更多