我正在构建一个使用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)
})