복잡한 Shiny 앱이 있습니다. 출력물이 selectize
이고 selectTest
인데,이 값은 반응 형 객체 인 isTestReady
에 의해 읽혀집니다. isTestReady
은 특정 조건이 selectTest
을 만족하는지 평가합니다. 그런 다음 isTestReady
은 여러 청크에서 게이트로 사용됩니다. selectTest
을 outputOptions(suspendWhenHidden = F, priority 999)
으로 설정하여 즉시 실행되도록했습니다.Reactive Chunk를 강제 평가하기
실행 중에는 selectTest
에 대한 청크가 먼저 실행됩니다. 이 후에 isTestReady
이 실행되면 첫 번째 청크에 selectTest
에 할당 된 값이 아닌 selectTest
의 값을 NULL로 계속 읽습니다. Shiny는 다시 돌아 오기 전에 다른 많은 모듈을 통해 isTestReady
을 재평가합니다. 재평가 후에 다른 청크가 다시 호출되고 이제는 정상적으로 실행됩니다.
예상되는 동작입니까? 그렇다면 내 시나리오를 어떻게 묘사하는 방식에 대한 아이디어가 있습니까?
예 -
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)
다음과 같이 위의 응용 프로그램에 대한 콘솔에 로그 출력을 보면 -
[1] "!"
[1] "?"
NULL
[1] "!!"
NULL
[1] "!"
[1] "?"
[1] "a"
[1] "!!"
[1] "a"
이 NULL을 피하기 위해 어떤 방법을? 내 응용 프로그램에는 temp()
을 찾는 청크가 많이 있는데, 모두 temp()
전에 실행됩니다.
하지만 해결책처럼 보일 것 - http://stackoverflow.com/questions/30378310/shiny-renderui-selectinput-returned-null?rq=1에게 당신은 바인딩 할 수 있습니다 – TheComeOnMan
'eventReactives'도 다른 반응들과 함께 사용합니다. 이렇게 :'eventReactives {temp(), {}}'. 또한 거기에 여러개를 넣을 수도 있습니다 –
@ PorkChop,'temp()'를 기반으로 새로운 출력 객체를 만들고 있으므로'eventReactive'는 옵션이 아닙니다. 지저분한 '지역'사업 등을하지 않는 한. – TheComeOnMan