【问题标题】:in R Shiny, update an object based on user input在 R Shiny 中,根据用户输入更新对象
【发布时间】:2019-08-15 11:05:47
【问题描述】:

我想在我的应用程序中始终显示我的图表 (g)。我想将g 的“默认”值硬编码到应用程序中,并且用户可以通过 UI 更新g。我正在使用 {{igraph}} 库及其函数,例如 make_empty_graphadd_vertices

我相信我此时的主要问题是我对g 进行了硬编码,但是g 的反应版本实际上是g()。我确信这个问题之前已经解决过很多次了,但是我在 Shiny 演示中看不到一个例子。

这是我在 server() 里面的内容:

g <- make_empty_graph(directed = TRUE) %>%
    add_vertices(nv = 1, depth = 0L, x = 0, y = 0, cur = TRUE)

g <- eventReactive(
    eventExpr = 'investigate',
    valueExpr = {
        add_children(g = g, vidx = input$vidx)
    }
)

output$the_plot <- renderPlot(
    expr = {    
       plot_graph(g())
    }
)

add_children()plot_graph() 在全局命名空间中定义。如果有帮助,我很乐意分享更多代码(或整个应用程序)。

根据 SO 的输入,工作版本是:

g <- reactiveVal(
    make_empty_graph(directed = TRUE) %>%
        add_vertices(nv = 1, depth = 0L, x = 0, y = 0, cur = TRUE)
)    

observeEvent(
    eventExpr = input$investigate,
    handlerExpr = g(add_children(g = g(), vidx = input$vidx)),
    ignoreInit = TRUE
)

output$the_plot <- renderPlot(plot_graph(g()))

【问题讨论】:

  • g 是一个图表。 make_new_graph 是来自 {{igraph}} 的函数。我将在上面澄清这一点。感谢您指出这一点。

标签: r shiny reactive


【解决方案1】:

如果我正确理解了您的问题,这里有一种使用reactiveValuesobserveEventignoreInit = TRUE 的方法。下面的应用程序将以 output$test 中的初始值 5 开始,但稍后将取决于 input$slider。这样,您始终在输出中引用反应值。

ui <- fluidPage(
  sliderInput("slider", "Slider", 1, 10, 10),
  verbatimTextOutput("test")
)

server <- function(input, output, session) {
  graph <- reactiveValues(g = 5)# initial value

  observeEvent(input$slider, {
    graph$g <- input$slider # new value
  }, ignoreInit = TRUE)

  output$test <- renderPrint({graph$g})

}

shinyApp(ui, server)

【讨论】:

  • graph 设置为reactiveVal 似乎是一个好的开始——谢谢。
  • 不要忘记ignoreInit = TRUE,否则应用启动时初始值会丢失。
猜你喜欢
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 2019-02-05
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多