如何在R中使用visNetwork创建基于一组边的第二个下拉列表?

yjghlzjz  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(205)

类似于Groups of edges and select in visNetwork in R,我想知道如何创建一个基于边缘的下拉列表,而不是使用visNetwork包的节点。我认为这是可能的visSetSelection函数,但这需要使用shiny。我交付的最终产品是从markdown呈现的html,而不是从服务器部署,所以我不认为这是一个可能的。
有没有办法在shiny之外复制这个函数呢?我不是很理解文档中的术语,但是我想我想做的是类似于visOptions函数中的nodeIdSelectionselectedBy参数,在这些函数中可以创建一个“HTML select元素”,但是基于边列表而不是节点列表。
这个特殊问题的数据集是专有的,但这里有一些虚拟数据。我希望能够选择的“重量”的边缘。

library(tidyverse)
    library(visNetwork)

    nodes <- tibble(id = 1:30)
    edges <- tibble(from = c(21:30, 1:20),
                    to = c(5:20, 21:30, 1:4),
                    weight = c(rep(1:5, 6)))

    visNetwork(nodes, edges) %>%
      visIgraphLayout(layout = "layout_in_circle") %>%
      visOptions(highlightNearest = list(enabled = T, 
                                         hover = T, 
                                         degree = 1, 
                                         algorithm = "hierarchical"), 
                                    nodesIdSelection = T)

我希望在visOptions中有一个edgesIdSelection参数,但这不是一个选项。我假设管道visSelectEdges可以工作,但这只适用于shiny,而我的客户端无法访问shiny服务器。我知道这个库是为了使javascript库可以通过R访问而创建的,所以我不期望它具有完整的功能--如果我不能在R中使用这个包来实现这一点(没有闪亮),我完全明白了。

pgpifvop

pgpifvop1#

看起来visNetwork包没有内置的方法来创建基于网络边缘的下拉列表,但是,您可以使用自定义JavaScript代码和R中的htmlwidgets包来实现这一点。
htmlwidgets包允许您使用R创建自定义交互式HTML小部件。您可以使用此包创建自定义小部件,其中包含基于网络边缘的下拉列表。然后,您可以在visNetwork图中使用此小部件。
下面是一个如何使用htmlwidgets包创建自定义小部件的示例:

# First, create a custom widget using the `htmlwidgets` package

# Set up the widget structure
widget <- htmlwidgets::createWidget(
  name = "mywidget",
  x = list(data = data.frame(x = 1:10, y = rnorm(10)),
           options = list(width = 500, height = 500))
)

# Add the widget HTML code
widget$html <- "<div id='mywidget'></div>"

# Add the JavaScript code that will create the widget
widget$javascript <- "
  var x = data.frame(x = 1:10, y = rnorm(10));
  var options = list(width = 500, height = 500);

  // Create the widget using the specified data and options
  var widget = new mywidget(
    document.getElementById('mywidget'),
    x,
    options
  );"

# Add the widget CSS code
widget$css <- ".mywidget { color: red; }"

# Register the widget
htmlwidgets::registerWidget(widget)

创建自定义微件后,可在visNetwork图中使用,如下所示:

# Create the visNetwork plot
visNetwork(nodes, edges) %>%
  visIgraphLayout(layout = "layout_in_circle") %>%
  visOptions(highlightNearest = list(enabled = T, 
                                     hover = T, 
                                     degree = 1, 
                                     algorithm = "hierarchical"), 
                                nodesIdSelection = T) %>%

  # Add the custom widget to the plot
  htmlwidgets::onRender("
    function(el, x, data) {
      var widget = new mywidget(
        el,
        data.x,
        data.options
      );
    }",
    data = list(x = data.frame(x = 1:10, y = rnorm(10)),
                options = list(width = 500, height = 500))
  )

然后,您可以向小部件添加自定义JavaScript代码,以创建基于网络边缘的下拉列表。此代码将特定于您的需要,因此,我建议您参考visNetwork文档以及visNetwork所基于的JavaScript库(vis.js)的文档,以获得有关如何创建下拉列表的指导。

相关问题