r-闪亮的视觉网络条件布局-绕过不兼容的选项



我正在构建一个使用visNetwork显示交互式网络的Shiny应用程序,我想让用户可以在两种igraph布局之间进行选择。问题是,一个布局所需的额外参数是另一个布局未使用的参数,我似乎无法有条件地删除它。

library(igraph)
library(shiny)
library(visNetwork)
# generate data
iGr <- make_graph("Meredith")
visGr <- toVisNetworkData(iGr)
# ui
ui <- fluidPage(
# layout options
radioButtons(
inputId="grLayout",
label="View in:",
choices=list(
"Graph layout"="layout_with_graphopt",
"Ellipse layout"="layout_in_circle"
),
selected="layout_with_graphopt"
),
visNetworkOutput("netPlot")
)
# server
server <- function(input, output){
output$netPlot <- renderVisNetwork({
visNetwork(visGr$nodes, visGr$edges) %>%
visIgraphLayout(physics=FALSE, type="square", layout=input$grLayout,
charge=0.1 # <- here's my problem
)
})  
}
shinyApp(ui=ui, server=server)

我需要layout_with_graphopt选项的charge参数和我的真实数据,以使可视化可读,但它抛出了一个";未使用的自变量(费用=0.1)";layout_in_circle选项错误。我尝试过这两种变体,但都没有成功。

这个根本不会运行,并抛出一个"论点";图形";缺少,没有默认错误:

output$netPlot <- renderVisNetwork({
visNetwork(visGr$nodes, visGr$edges) %>%
{if (input$grLayout=="layout_with_graphopt") {
visIgraphLayout(physics=FALSE, type="square", layout=input$grLayout,
charge=0.1)
} else {
visIgraphLayout(physics=FALSE, type="square", layout=input$grLayout)
}}
})

这个投掷了一个";未使用的参数(charge=NULL)";layout_in_circle选项的错误。(如果我尝试NA,我会得到类似的结果):

output$netPlot <- renderVisNetwork({
chargeVal <- if (input$grLayout=="layout_with_graphopt") {0.1} else {NULL}
visNetwork(visGr$nodes, visGr$edges) %>%
visIgraphLayout(physics=FALSE, type="square", layout=input$grLayout,
charge=chargeVal)
})

我宁愿不在整个renderVisNetwork块上做if else,因为真正的块相当长,有相当多的铃铛和口哨,而charge自变量将是它们之间唯一的区别。

我想明白了。诀窍是将除之外的所有visIgraphLayout行粘贴到visNetwork对象中,然后将visIgraphLayout的条件版本管道传输到其背面:

output$netPlot <- renderVisNetwork({
plot1 <- visNetwork(visGr$nodes, visGr$edges)
# can add whatever other bells and whistles needed before if/else if
# conditional layout:
if (input$grLayout=="layout_with_graphopt"){
plot2 <- plot1 %>%
visIgraphLayout(physics=FALSE, type="square", layout=input$grLayout,
charge=0.1)
} else if (input$grLayout=="layout_in_circle") {
plot2 <- plot1 %>%
visIgraphLayout(physics=FALSE, type="square", layout=input$grLayout)
}
return(plot2)
})

相关内容

  • 没有找到相关文章

最新更新