FURRR на Tidygraph говорит: "Функция не должна вызываться напрямую"
Параллельные вычисления функций центральности тидиграфа с использованием furrr приводят к ошибке:
"Ошибка в mutate_impl(.data, dots): Ошибка оценки: эту функцию нельзя вызывать напрямую".
Вот мой код:
library(tidyverse); library(tidygraph)
H <- play_islands(5, 10, 0.8, 3)
cent <- tribble(
~f, ~params,
"centrality_degree", list(H),
"centrality_authority", list(H)
)
cent %>%
mutate(centrality = future_invoke_map(f, params, .options = future_options(packages = c("tidygraph", "tidyverse"))))
Как мне это исправить?
0 ответов
Я считаю, что вы неправильно понимаете, как работает тидиграф, что мешает вам правильно его кодировать.
Функции centrality_degree()
а также centrality_authority()
оба используются в mutate()
заявление (см. https://tidygraph.data-imaginist.com/reference/centrality.html).
library(tidygraph)
#> Attaching package: 'tidygraph'
#> The following object is masked from 'package:stats':
#>
#> filter
create_notable('bull') %>%
activate(nodes) %>%
mutate(importance = centrality_authority())
#> # A tbl_graph: 5 nodes and 5 edges
#> #
#> # An undirected simple graph with 1 component
#> #
#> # Node Data: 5 x 1 (active)
#> importance
#> <dbl>
#> 1 0.869
#> 2 1
#> 3 1
#> 4 0.434
#> 5 0.434
#> #
#> # Edge Data: 5 x 2
#> from to
#> <int> <int>
#> 1 1 2
#> 2 1 3
#> 3 2 3
#> # ... with 2 more rows
Создано 2020-07-03 пакетом REPEX (v0.3.0)
Обратите внимание, что centrality_authority()
функции в mutate()
заявление. Другими словами, вам нужно обернуть эти функции вокруг другой функции, чтобы передать ееfurrr
функции.
Также обратите внимание, что результат правильного использования этих функций возвращает tidygraph
объект. Есть функция graph_join()
что позволяет нам объединить несколько графов. Итак, план, аналогичный предложенному вами, состоит в том, чтобы вычислить отдельные меры центральности, каждая из которых возвращает объект графика, а затем объединить их вместе сgraph_join()
.
Обладая этими знаниями, мы можем закодировать это следующим образом (обратите внимание на небольшое изменение в вашем коде, где мы должны добавить уникальное имя идентификатора к узлам, чтобы мы могли объединить графики вместе).
# Load libraries
library(tidyverse)
library(tidygraph)
#> Attaching package: 'tidygraph'
#> The following object is masked from 'package:stats':
#>
#> filter
library(furrr)
#> Loading required package: future
# Create example graph
H <- play_islands(5, 10, 0.8, 3) %>%
mutate(name = 1:50) # Add node names to join
# Create functions to add centrality measures
f_c_deg <- function(x) x %>% mutate(c_deg = centrality_degree())
f_c_aut <- function(x) x %>% mutate(c_aut = centrality_authority())
# Setup mapping data frame
cent <- tribble(
~f, ~params,
"f_c_deg", list(x = H),
"f_c_aut", list(x = H)
)
# Apply functions and join
res <- future_invoke_map(cent$f, cent$params)
one_g <- Reduce(graph_join, res) # Put together results and view single graph
#> Joining, by = "name"
one_g
#> # A tbl_graph: 50 nodes and 416 edges
#> #
#> # A directed acyclic multigraph with 1 component
#> #
#> # Node Data: 50 x 3 (active)
#> name c_deg c_aut
#> <int> <dbl> <dbl>
#> 1 1 7 0.523
#> 2 2 9 0.661
#> 3 3 9 0.670
#> 4 4 8 0.601
#> 5 5 9 0.637
#> 6 6 11 0.823
#> # ... with 44 more rows
#> #
#> # Edge Data: 416 x 2
#> from to
#> <int> <int>
#> 1 1 2
#> 2 1 3
#> 3 1 4
#> # ... with 413 more rows
Создано 2020-07-03 пакетом REPEX (v0.3.0)