r - 光沢のある renderText が reactiveValues の変更に反応しない

okwaves2024-01-24  6

アプリに小さなイライラする問題があります。このオブジェクトoutput$timeheader <- renderText()は、user$stationtypeまたはuser$stationvarが変更された場合には反応せず、stationname()が変更された場合にのみ反応します。

リプレックスを作成しようとしましたが、バグを再現できません。この例では意図したとおりに動作します。私のアプリでは、user$stationtype または user$stationvar を変更しても、output$timeheader <- renderText() はトリガーされません。

library(shiny)

ui <- tagList(
  navbarPage(
    title = "navbarPage", 
    tabPanel(
      title = "tabPanel",
      tags$div(
        absolutePanel(
          tabsetPanel(
            tabPanel(
              title = "title",
              tags$div(
                actionButton("changesel", "Choose a different variable"),
                textInput("map_marker_click", "Enter station name"),
                h4(strong(textOutput("timeheader")))
              )
            )
          )
        )
      )
    )
  )
)

server <- function(input, output, session){
  # collect inputs needed by model
  user <- reactiveValues(
    stationvar = NA,
    stationtype = NA
  )
  # observe changes in ui and pass to user$
  observe({
    input$changesel # observe button click
    ot <- runif(1)
    isolate({
      obsnut <- ifelse(ot > 0.6, "DIN", "NONE") # obs to use
      obsgroup <- ifelse(ot > 0.3, "Streams", "none")
      if (!setequal(obsnut, user$stationvar)){
        cat("user$stationvar <-", obsnut, "\n")
        user$stationvar <- obsnut
      }
      if (!setequal(obsgroup, user$stationtype)){
        cat("user$stationtype <-", obsgroup, "\n")
        user$stationtype <- obsgroup
      }
    }) # end isolate
  })
  # timeheader ####
  output$timeheader <- renderText({
    # req(user$stationtype, user$stationvar)
    # FIXME why doesn't this stupid text show!!! ####
    cat("Time series header:", user$stationtype, stationname(), user$stationvar, "\n")
    if (isTRUE(stationname() > "")){
      "Time series plot:"
    } else if (isTRUE(user$stationvar != "NONE")){
      "Enter station name to view data:"
    } else {
      ""
    }
  })
  ## click on marker to get stationname ####
  stationname <- reactive({
    req(isTRUE(user$stationvar != "NONE"))
    cat("Marker click\n")
    input$map_marker_click
  })
}

shinyApp(ui, server)

1

おそらくこれが役に立つかもしれません: Shiny が異常な動作をしたとき、私が最初に行うことはo 同じ出力名を 2 回 (たとえば 2 つのタブで) 使用するという間違いを犯していないかどうかを確認してください。

– ワルディ

2020 年 9 月 3 日 19:18

ありがとう、確認しました。実際には、user$ 変数が変更されていることはわかっていますが、無効化されていないようです。

– サイモン・ウッドワード

2020 年 9 月 3 日 19:28

1

user$ 変数は分離で更新されるため無効にならない可能性がありますか?

– ワルディ

2020 年 9 月 3 日 19:35

確かに、isolate() で更新されていますが、これがなぜ問題なのでしょうか?私は、isolate は、isolate 内で読み取られた変数への反応を防ぐだけだと思っていました。しかし、割り当ては引き続き機能するはずです?

– サイモン・ウッドワード

2020 年 9 月 3 日 19:40

1

これは単なる推測でしたが、行ったテストからわかるように、おそらく正しいでしょう。

– ワルディ

2020 年 9 月 3 日 19:56



------------------------

私の推測では、req によりステーションのリアクティブが null になることに関係があるのではないかと思います。試してみてください:

  stationname <- eventReactive(input$map_marker_click,{
    req(isTRUE(user$stationvar != "NONE"))
    cat("Marker click\n")
    input$map_marker_click
  }, ignoreNULL = F)

1

その通りです!ステーション名をより注意深く初期化すると、機能します。ありがとう!

– サイモン・ウッドワード

2020 年 9 月 3 日 20:42

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。