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