Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 强制计算反应块_R_Shiny - Fatal编程技术网

R 强制计算反应块

R 强制计算反应块,r,shiny,R,Shiny,我有一个复杂的闪亮应用程序。我有一个selectize输出对象,selectTest,它的值由一个反应对象istestrady读取istestrady评估selectTest是否满足某些条件istestrady然后在各种块中用作门。我已将selectTest设置为输出选项(suspendWhenHidden=F,优先级999),以确保它立即启动并运行 在运行时,我注意到selectTest的块首先被执行。当istestrady在此之后运行时,它仍然将selectTest的值读取为NULL,而不是

我有一个复杂的闪亮应用程序。我有一个
selectize
输出对象,
selectTest
,它的值由一个反应对象
istestrady
读取
istestrady
评估
selectTest
是否满足某些条件
istestrady
然后在各种块中用作门。我已将
selectTest
设置为
输出选项(suspendWhenHidden=F,优先级999)
,以确保它立即启动并运行

在运行时,我注意到
selectTest
的块首先被执行。当
istestrady
在此之后运行时,它仍然将
selectTest
的值读取为NULL,而不是第一个块中分配给
selectTest
的任何值。然后,在返回重新评估
istestrady
之前,Shining将完成许多其他模块。在重新评估之后,再次调用其他块,现在它们运行良好

这是预期的行为吗?如果是这样的话,关于如何让我的场景按照我描述的方式进行,有什么想法吗

范例-

library(shiny)
library(shinydashboard)


# Setup Shiny app UI components -------------------------------------------

ui <- dashboardPage(

   dashboardHeader(),
   ## Sidebar content
   dashboardSidebar(
      sidebarMenu(
         uiOutput('someelement'),
         textOutput('temp2')
      )
   ),
   dashboardBody(  )

)


# Setup Shiny app back-end components -------------------------------------

server <- function(input, output) {

   output[['someelement']] = renderUI({
      selectizeInput(
         inputId = 'someelement',
         choices = letters,
         selected = letters[1],
         label = 'Custom Functions',
         multiple = F
      )
   })

   outputOptions(
      output,
      'someelement',
      suspendWhenHidden = F
   )

   temp = reactive({
      print('?')
      input[['someelement']]
   })

   observe({
      print('!')
      print(temp())
   })

   output[['temp2']] = renderText({
      print('!!')
      print(temp())
      '-'
   })

}

# Render Shiny app --------------------------------------------------------

shinyApp(ui, server)
有没有办法避免这种情况?在我的应用程序中,有许多块查找
temp()
,所有这些块都在
temp()
之前运行尝试使用observe()和reactiveValues(),请参阅已接受的答案。reactive()是懒惰的

我编辑了你的问题,以便文本中的变量名与你的代码匹配。但我可能没有领会你的意思。像这样的

library(shiny)
library(shinydashboard)


# Setup Shiny app UI components -------------------------------------------

ui <- dashboardPage(

  dashboardHeader(),
  ## Sidebar content
  dashboardSidebar(
    sidebarMenu(
      uiOutput('ui_selectTest') 
    )
  ),
  dashboardBody(  )

)


# Setup Shiny app back-end components -------------------------------------

server <- function(input, output) { 

  rv<- reactiveValues()

  output$ui_selectTest = renderUI({
    selectizeInput(
      inputId = 'selectTest',
      choices = letters,
      selected = letters[1],
      label = 'Custom Functions',
      multiple = F
    )
  })

  observe(
    if(!is.null(input$selectTest)) { 
      #check select test
      rv$testReady <- input$selectTest
    }
  )

  observeEvent(rv$testReady,{
    print(  rv$testReady  )
  })
} 

shinyApp(ui, server)
库(闪亮)
图书馆(shinydashboard)
#设置应用程序UI组件-------------------------------------------
ui尝试使用observe()和reactiveValues(),查看可接受的答案。reactive()是懒惰的

我编辑了你的问题,以便文本中的变量名与你的代码匹配。但我可能没有领会你的意思。像这样的

library(shiny)
library(shinydashboard)


# Setup Shiny app UI components -------------------------------------------

ui <- dashboardPage(

  dashboardHeader(),
  ## Sidebar content
  dashboardSidebar(
    sidebarMenu(
      uiOutput('ui_selectTest') 
    )
  ),
  dashboardBody(  )

)


# Setup Shiny app back-end components -------------------------------------

server <- function(input, output) { 

  rv<- reactiveValues()

  output$ui_selectTest = renderUI({
    selectizeInput(
      inputId = 'selectTest',
      choices = letters,
      selected = letters[1],
      label = 'Custom Functions',
      multiple = F
    )
  })

  observe(
    if(!is.null(input$selectTest)) { 
      #check select test
      rv$testReady <- input$selectTest
    }
  )

  observeEvent(rv$testReady,{
    print(  rv$testReady  )
  })
} 

shinyApp(ui, server)
库(闪亮)
图书馆(shinydashboard)
#设置应用程序UI组件-------------------------------------------

ui只需在每个反应块中使用
validate
,检查所有需要的输入和条件。然后,您的服务器功能将如下所示

server <- function(input, output) {

  output[['someelement']] = renderUI({
    selectizeInput(
      inputId = 'someelement',
      choices = letters,
      selected = letters[1],
      label = 'Custom Functions',
      multiple = F
    )
  })

  outputOptions(
    output,
    'someelement',
    suspendWhenHidden = F
  )

  temp = reactive({
    #check if someelement is a valid input
    validate(need(input[['someelement']] %in% letters, "need input")) 
    print('?')
    input[['someelement']]
  })

  observe({
    #check if tmp() has already been evaluated
    validate(need(temp(), "need tmp"))  
    print('!')
    print(temp())
  })

  output[['temp2']] = renderText({
    validate(need(temp(), "need tmp"))
    print('!!')
    print(temp())
    '-'
  })

}

server只需在每个反应块中使用
validate
,检查所有需要的输入和条件。然后,您的服务器功能将如下所示

server <- function(input, output) {

  output[['someelement']] = renderUI({
    selectizeInput(
      inputId = 'someelement',
      choices = letters,
      selected = letters[1],
      label = 'Custom Functions',
      multiple = F
    )
  })

  outputOptions(
    output,
    'someelement',
    suspendWhenHidden = F
  )

  temp = reactive({
    #check if someelement is a valid input
    validate(need(input[['someelement']] %in% letters, "need input")) 
    print('?')
    input[['someelement']]
  })

  observe({
    #check if tmp() has already been evaluated
    validate(need(temp(), "need tmp"))  
    print('!')
    print(temp())
  })

  output[['temp2']] = renderText({
    validate(need(temp(), "need tmp"))
    print('!!')
    print(temp())
    '-'
  })

}

与服务器相关但不是解决方案-您也可以将
eventreactive
与其他reactive绑定。像这样:
eventReactives{temp(),{}
。你也可以有多个在那里too@PorkChop,我正在基于
temp()
创建新的输出对象,因此
eventReactive
不是一个选项。除非我处理凌乱的
local
等业务。相关但不是解决方案-您也可以将
eventreactive
与其他reactive绑定。像这样:
eventReactives{temp(),{}
。你也可以有多个在那里too@PorkChop,我正在基于
temp()
创建新的输出对象,因此
eventReactive
不是一个选项。除非我在当地做些乱七八糟的事。谢谢。这个建议类似于我在评论中的链接。谢谢。这个建议类似于我在评论中的链接。谢谢。这看起来很有希望。我会在我的应用程序上检查一次(可能需要一两天)。我会勾选答案是否有效。我有一种感觉,由于temp的NULL值,这基本上会阻止其余的observe块的执行,并且实际上不会强制对temp进行求值。这看起来很有希望。我会在我的应用程序上检查一次(可能需要一两天)。我会检查答案是否有效。我有一种感觉,由于temp的NULL值,这基本上会阻止其余的observe块的执行,并且实际上不会强制对temp进行计算。