Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R闪亮:使用htmlOutput和ObserveeEvent产生不必要的反应_R_Shiny_Shiny Reactivity - Fatal编程技术网

R闪亮:使用htmlOutput和ObserveeEvent产生不必要的反应

R闪亮:使用htmlOutput和ObserveeEvent产生不必要的反应,r,shiny,shiny-reactivity,R,Shiny,Shiny Reactivity,问题摘要 我已经彻底搜查了一遍,找不到有人问过同样的问题。我正在使用R Shining制作一个化学反应模拟网页,希望向用户显示最近模拟的变量。因此,用户可以更改输入变量,但在再次按下操作按钮并模拟另一个反应之前,显示的“变量摘要面板”不应更改 使用observeEvent、renderUI和htmlOutput的实现应该相当简单,但我在“变量摘要面板”对输入变量的更改做出反应时遇到了问题,即使没有按下操作按钮。下面是一些示例代码: 示例代码 library(shiny) library(tidy

问题摘要

我已经彻底搜查了一遍,找不到有人问过同样的问题。我正在使用R Shining制作一个化学反应模拟网页,希望向用户显示最近模拟的变量。因此,用户可以更改输入变量,但在再次按下操作按钮并模拟另一个反应之前,显示的“变量摘要面板”不应更改

使用observeEvent、renderUI和htmlOutput的实现应该相当简单,但我在“变量摘要面板”对输入变量的更改做出反应时遇到了问题,即使没有按下操作按钮。下面是一些示例代码:

示例代码

library(shiny)
library(tidyverse)

ui <- fluidPage(
   # input variable
   tags$p("Reaction Temperature  (ºC)"),
   sliderInput("temp_initial",NULL,min = 20,max = 70,value = 25),
   # action button
   actionButton(inputId = "go", label = "Generate Reaction Simulation"),
   # summary panel
   wellPanel(
       tags$p(tags$strong("Simulated input variables")),
       htmlOutput("blurb_explanation")
   )
)
server <- function(input, output, session) {
    # render summary panel text
    observeEvent(input$go, ({
        output$blurb_explanation <- renderUI(
           HTML(paste("<strong>   Reaction Temperature (ºC) --></strong>", input$temp_initial))
        )
    })
    )
}
# Run the application 
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(tidyverse)

ui默认情况下,您的
renderUI
-与任何
renderXXXX
-一样,都会更新以响应对其包含的任何反应的更改。因此,它会根据您的
操作按钮的点击和
幻灯片的输入进行更新。您无法摆脱它对
sliderInput
的依赖,因此您需要
renderUI
从对
sliderInput
的更改中分离出来。幸运的是,
isolate
函数可以为您做到这一点

以下是服务器功能的工作版本:

server <- function(input, output, session) {
  # render summary panel text
  observeEvent(input$go, ({
    output$blurb_explanation <- renderUI(
      isolate(HTML(paste("<strong>   Reaction Temperature (ºC) --></strong>", input$temp_initial)))
    )
  })
  )
}
renderText
仍然依赖于
actionButton
,因此它会根据对按钮的单击进行更新。但是
action按钮
不会生成任何输出。
htmlOutput
sliderInput
的依赖性仍然被
isolate
屏蔽,因此输出只会在单击按钮时更新


PS.欢迎使用SO。

默认情况下,您的
renderUI
-与任何
renderXXXX
-一样,会根据其包含的任何反应物的更改进行更新。因此,它会根据您的
操作按钮的点击和
幻灯片的输入进行更新。您无法摆脱它对
sliderInput
的依赖,因此您需要
renderUI
从对
sliderInput
的更改中分离出来。幸运的是,
isolate
函数可以为您做到这一点

以下是服务器功能的工作版本:

server <- function(input, output, session) {
  # render summary panel text
  observeEvent(input$go, ({
    output$blurb_explanation <- renderUI(
      isolate(HTML(paste("<strong>   Reaction Temperature (ºC) --></strong>", input$temp_initial)))
    )
  })
  )
}
renderText
仍然依赖于
actionButton
,因此它会根据对按钮的单击进行更新。但是
action按钮
不会生成任何输出。
htmlOutput
sliderInput
的依赖性仍然被
isolate
屏蔽,因此输出只会在单击按钮时更新


PS.欢迎来到SO。

谢谢!我没有尝试将隔离放置在渲染函数的文本内部,只是放置在外部。你的解决方案是有效的——我之所以选择renderUI是因为实际的摘要面板大约有10行,使用htmlOutput进行中断比较容易。我感谢你的帮助!非常感谢。我没有尝试将隔离放置在渲染函数的文本内部,只是放置在外部。你的解决方案是有效的——我之所以选择renderUI是因为实际的摘要面板大约有10行,使用htmlOutput进行中断比较容易。我感谢你的帮助!