addTooltip在observeEvent中有两个输入时间歇性工作

addTooltip在observeEvent中有两个输入时间歇性工作,r,shiny,vis.js,shinybs,R,Shiny,Vis.js,Shinybs,我正在构建一个吸引网络的闪亮应用程序。用户可以选择一个节点,单击切换按钮以显示该节点的ego网络,然后单击相同的按钮返回主网络。我正在尝试获取一个工具提示,将鼠标悬停在按钮上,其中的文本根据按钮本身的状态以及是否选择了节点而变化。问题在于,工具提示仅在每隔一次条件更改时显示 可复制代码: 用户界面: 服务器:(很抱歉代码太长-不太确定哪里出错,我想提供足够的上下文) 我得到了完全相同的行为。这排除了两个observeEvent块相互干扰和/或在observeEvent中有两个输入的问题。通过使用

我正在构建一个吸引网络的闪亮应用程序。用户可以选择一个节点,单击切换按钮以显示该节点的ego网络,然后单击相同的按钮返回主网络。我正在尝试获取一个工具提示,将鼠标悬停在按钮上,其中的文本根据按钮本身的状态以及是否选择了节点而变化。问题在于,工具提示仅在每隔一次条件更改时显示

可复制代码:

用户界面:

服务器:(很抱歉代码太长-不太确定哪里出错,我想提供足够的上下文)

我得到了完全相同的行为。这排除了两个
observeEvent
块相互干扰和/或在
observeEvent
中有两个输入的问题。通过使用相同的逻辑将文本发送到全局环境中的对象,我对
if-else-if
逻辑进行了四次检查,并且所有的检查都成功了。这一定是在工具提示中循环的结果,这就是我没有想法的地方

# libraries
library(shiny)
library(shinyBS)
library(igraph)
library(visNetwork)

# UI
shinyUI(
  fluidPage(
    visNetworkOutput("NetPlot",width="auto",height=600),
    bsButton("Ego",label=textOutput("EgoText"),type="toggle",disabled=TRUE)
  )
)
# libraries
library(shiny)
library(shinyBS)
library(igraph)
library(visNetwork)

# create data
nodes <- data.frame(id=c("10","11","12","13","14"))
edges <- data.frame(rbind(c("10","12"),c("10","14"),c("11","12"),c("13","14"),c("14","12")))
colnames(edges) <- c("from","to")

shinyServer(function(input,output,session) {

  # Activate Ego Network button when a node is selected
  observeEvent(input$NetPlot_selected, {
    if (input$NetPlot_selected=="") disabled = TRUE 
    else disabled = FALSE
    updateButton(session,"Ego", disabled=disabled)
  }, priority=1)

  # Set Ego Button text
  # "Full Network" when TRUE, "Ego Network" when FALSE
  output$EgoText <- renderText({
    ifelse ((input$Ego), as.character("Full Network"), as.character("Ego Network"))
  })

  # Set tooltip text
  # Works intermittently
  observeEvent({
    input$Ego
    input$NetPlot_selected},
    {
      # No node is selected yet
      if (is.null(input$NetPlot_selected) || input$NetPlot_selected=="")
      {hovtx <- as.character("Select a node to extract ego network")} 
     # Node is selected
      else if (!input$Ego && input$NetPlot_selected!="")
      {hovtx <- as.character("Click to go to ego network")} 
     # Ego network is displayed
      else if (!(is.null(input$Ego)) && input$Ego)
      {hovtx <- as.character("Click to return to full network")}
      addTooltip(session,"Ego",hovtx,"right",trigger="hover", options=list(container="body"))
      },priority=2)

  # Create ego network dataframe when toggle button is on
  EgoNet <- reactive({
    req(input$Ego)
    # Convert main network to igraph
    ego1 <- graph_from_data_frame(edges, directed=FALSE, nodes)
    # Get ego network of the selected node
    ego2 <- make_ego_graph(ego1, nodes=input$NetPlot_selected)[[1]]
    # Convert back to visNetwork
    ego3 <- toVisNetworkData(ego2)
    ego3
  })

  # Plot the network
  output$NetPlot <- renderVisNetwork({
    if (input$Ego){ # Ego network is requested
      visNetwork(EgoNet()$nodes, EgoNet()$edges) %>%
        visIgraphLayout(physics=FALSE, type="full", layout="layout_with_kk")
    } else
    { # Ego network not requested
      visNetwork(nodes,edges) %>%
        visOptions(nodesIdSelection=TRUE,
                   highlightNearest=list(
                     enabled=TRUE, labelOnly=FALSE)
        ) %>%
        visIgraphLayout(physics=FALSE, type="full", layout="layout_with_kk")
    }
  })
})
  output$EgoTip <- renderUI({ 
    if (is.null(input$NetPlot_selected) || input$NetPlot_selected=="")
    {bsTooltip("Ego", "Select a node to extract ego network", "right",
               options=list(container="body"))} 
    else if (!input$Ego && input$NetPlot_selected!="")
    {bsTooltip("Ego", "Click to go to ego network", "right", 
               options=list(container="body"))}
    else if (!(is.null(input$Ego)) && input$Ego)
    {bsTooltip("Ego", "Click to return to full network", "right", 
               options=list(container="body"))}
  })