代码之家  ›  专栏  ›  技术社区  ›  Ju Ko

用于打印和保存igraph对象的函数在使用lappy时跳过列表元素

  •  1
  • Ju Ko  · 技术社区  · 8 年前

    我有一个网络对象列表,我想通过该列表,绘制每个网络,并保存到我的工作目录绘图。

    # 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,我只看到第一个和最后一个情节。

    一开始,我认为这可能是一个不太可能的巧合,当同一个Rand被选中,文件被覆盖。但我试了好几次,每次都是这样。

    2 回复  |  直到 8 年前
        1
  •  2
  •   G5W    8 年前

    # 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())
    

    就在你生成兰德之后。

        2
  •  1
  •   Parfait    8 年前

    网络

    lapply 具有 seq_along 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)