如Thomas Kilian所述here所述,带有令牌的活动图节点的正常行为是:
当一个节点的所有传入
InformationFlow connectors
都到达一个令牌时,该节点就变为活动状态。节点完成时,它将沿着所有传出的InformationFlow连接器发送单个令牌。
但是他补充说:
有一些特殊的节点,例如fork和merge,其行为有所不同
我知道“合并”节点的行为有所不同,因为它通过接收第一个令牌立即变为活动状态,并接受多个备用流中的一个。但是具有正常行为的令牌的fork / join节点的行为之间有什么区别?
答案 0 :(得分:1)
library(shiny)
script <- '
Shiny.addCustomMessageHandler("jsCode", function(message) {
eval(message.value);
});
function hello() {
console.log("hello from function hello!");
};
'
ui <- fluidPage(
tags$head(tags$script(HTML(script))),
actionButton("go", label = "Run")
)
server <- function(input, output, session) {
observeEvent(input$go, {
session$sendCustomMessage(type='jsCode', 'Shiny.onInputChange("foo", "bar");')
print(input$foo) # output is NULL
session$sendCustomMessage(type='jsCode', 'hello();')
# this does not work either. This is how I originally intended to do this.
# By defining a javascript function that aggregates the user selection data and
# send it to the server via Shiny.onInputChange
})
}
shinyApp(ui = ui, server = server)
-和Merge
看起来相同,但是元素不同:。
在图中,您只能通过查看传入和传出DecisionNode
来区分两者。第一个具有多个传入和一个传出,而第二个具有相反的关系。 InformationFlow
接受任何传入令牌并将其直接转发到其单个传出MergeNode
。因此,与InformationFlow
不同的是,它不会等待所有令牌。相反,Action
仅接受单个令牌,并使其仅传递到其传出的DecisionNode
中的一个。建模者有责任以只有一个人评估为正确的方式来设置防护。如果有更多InformationFlow
(甚至没有人看守),令牌将采用任意的自由路线。
InformationFlow
和Fork
也是看起来相同的两个不同元素:(或垂直)。
您还可以通过输入Join
的数量来区分它们。 InformationFlow
一进一出,Fork
反之亦然。一旦令牌到达其单个传入的Join
,Fork
将发送与发出的InformationFlow
一样多的令牌。 InformationFlow
(像Join
一样)将等待令牌到达其所有传入Action
的令牌。只有这样,它才会在其单个传出InformationFlow
处出现单个令牌。
因此,虽然InformationFlow
-和Merge
控制单个令牌的流(执行路径),DecisionNode
和Fork
用于启动和同步并行执行路径。