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进行计算。