Функция для построения и сохранения объектов igraph пропускает элементы списка при использовании lapply - PullRequest
0 голосов
/ 14 сентября 2018

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

# creating list of networks
networks <- list()
networks[[1]] <- graph(c("A","B"))
networks[[2]] <- graph(c("C","D"))
networks[[3]] <- graph(c("E","F"))

Ожидаемый вывод, который я хотел бы сохранитьрабочий каталог:

# looking at plots
plot(networks[[1]])
plot(networks[[2]])
plot(networks[[3]])

Поскольку мой список довольно длинный, и в исходном примере мне нужно передать некоторые начальные параметры, я хотел бы иметь функцию, которая отображает и сохраняет каждую сеть, а затем lapply() это к списку.Вот что я попробовал:

# generating and saving plots automatically
Plotter <- function(network){

        # Generate some random number so plots don´t get overwritten
        Rand <- runif(1,0,100000)

        # setting seed
        set.seed(123)

        # set up picture device
        jpeg(paste(Rand,"NetworkPlot.jpg",sep=""),
             width = 800,
             height = 800,
             units = "px",
             quality = 100)

        # plotting the network
        plot(network)

        # saving to wd
        dev.off()

}

# Applying function to list of networks
lapply(networks,Plotter)

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

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

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вместо использования случайного числа, которое высевается после первого запуска, используйте порядковый номер списка, повторяя по длине сетей .

В частности, рассмотрите возможность вызова lapply с seq_along и, таким образом, передаете целые числа в определенную функцию, которая будет использоваться для: 1) различных имен файлов и 2) индексирования вашего списка: networks[[##]].Кроме того, если у вас есть проблема с любым сюжетом, вы знаете, какой элемент является проблемой!

# generating and saving plots automatically
Plotter <- function(n){    
    # set up picture device
    jpeg(paste0("NetworkPlot_", n, ".jpg"),
         width = 800,
         height = 800,
         units = "px",
         quality = 100)

    # plotting the network
    plot(networks[[n]])

    # saving to wd
    dev.off()    
}

lapply(seq_along(networks), Plotter)

Аналогично, именованный список может работать в том же аспекте, где строки передаются в функцию:

# NAMING ITEMS: n1, n2, n3, ...
networks <- setNames(networks, paste0("n", seq_along(networks)))

# OUTPUT PLOTS
networks$n1
networks$n2
networks$n3
...

# SAVE PLOTS TO DISK
lapply(names(networks), Plotter)
0 голосов
/ 14 сентября 2018

Учитывая то, как вы сгенерировали имена, весьма вероятно, что одни и те же числа будут сгенерированы дважды.На самом деле это гарантировано.Ваш код говорит:

# Generate some random number so plots don´t get overwritten
Rand <- runif(1,0,100000)

# setting seed
set.seed(123)

При первом запуске он сгенерирует одно случайное число от 0 до 100000. Затем вы установите случайное начальное число на 123. Во второй раз, когда вы выполняете функцию, онасгенерирует число, начиная с начального числа 123. Затем сбросьте начальное число на 123. Каждый последующий раз оно будет генерировать число из случайного начального числа 123 и перезаписывать все предыдущие результаты, кроме первого.Таким образом, вы получите первое и последнее.Просто удалите строку, которая устанавливает начальное число, и вы получите все разные числа и, следовательно, разные имена файлов.

Если вы хотите проверить это, оставьте свой код как есть, но добавьте строку

write(paste0(Rand, "\n"), stderr())

сразу после генерации Рэнда.

...