visNetwork + R: показывать метки узлов только при выборе

1

пытаясь отобразить метки узлов только на выбранных узлах.

Я нашел аналогичный вопрос, который хотел показывать только метки метки при наведении. Решением было следующее:

nodes <- data.frame(id = 1:3, label = 1:3)
edges <- data.frame(from = c(1,2), to = c(1,3), label = "Edge label", font.size = 0)
visNetwork(nodes, edges) %>%
  visInteraction(hover = T) %>%
  visEvents(hoverEdge = "function(e){
    this.body.data.edges.update({id: e.edge, font: {size : 14}});
  }") %>%
  visEvents(blurEdge = "function(e){
    this.body.data.edges.update({id: e.edge, font: {size : 0}});
  }")

Я пробовал модифицировать это, но я не думаю, что я делаю часть javascript правильно, я знаю, что JS почти нет.

nodes <- data.frame(id = 1:3, label = 1:3)
edges <- data.frame(from = c(1,2), to = c(1,3), label = "Edge label", font.size = 0)
visNetwork(nodes, edges) %>%
  visInteraction(hover = T) %>%
  visEvents(selectNode= "function(e){
    this.body.data.nodes.update({id: e.node, font: {size : 14}});
  }") %>%
  visEvents(deselectNode= "function(e){
    this.body.data.nodes.update({id: e.node, font: {size : 0}});
  }")

Это вместо этого создает новый узел при каждом выборе или отмене выбора узла. Хотя сидеть и нажимать на них было забавным способом разрушить мой Rsession, он, к сожалению, не решил мою проблему.

Я уверен, что это простое исправление, но я прошел через документацию visNetwork, и я просто не нахожу то, что мне нужно. Помогите оценить!

  • 0
    Вы пытаетесь сделать это в блестящем приложении, или вы просто создаете HTML-виджет?
  • 0
    Просто виджет HTML. Код, который я разместил, - все, с чем я работаю.
Показать ещё 2 комментария
Теги:
visnetwork

1 ответ

1

Это должно сделать трюк. Этот JS фактически создает переменную, основанную на обеих меток в фрейме данных. Я уверен, что есть более технический метод для этого, но он все равно должен работать нормально.

library(visNetwork)


nodes <- data.frame(id = 1:3, label = paste0(""), label_long = c('Label 1','Label 2','Label 3'))
edges <- data.frame(from = c(1,2), to = c(1,3), label = "Edge label", font.size = 0)

net <- visNetwork(nodes, edges) %>%
  visInteraction(hover = T) %>%
  visEvents(selectNode  = "function(e){
            var label_info = this.body.data.nodes.get({
            fields: ['label', 'label_long'],
            filter: function (item) {
            return item.id === e.node
            },
            returnType :'Array'
            });
            this.body.data.nodes.update({id: e.node, label : label_info[0].label_long, label_long : label_info[0].label});
            }") %>% 
  visEvents(blurNode  = "function(e){
            var label_info = this.body.data.nodes.get({
            fields: ['label', 'label_long'],
            filter: function (item) {
            return item.id === e.node
            },
            returnType :'Array'
            });
            this.body.data.nodes.update({id: e.node, label : label_info[0].label_long, label_long : label_info[0].label});
  }")

print(net)
  • 0
    Это действительно близко, но это заставляет метку появляться, когда узел выбран, но она остается, когда отмена выбора. Это очень близко, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню