2016-08-02 41 views
1

我需要在lapply函数中写入一个文件。我刮了一大堆网页,我想每100次左右保存一次输出。我用下面的代码R:保存在一个lapply中

from = seq(1,100, 10) 
aa <- length(url) 
func1 = function(url){ 
    out <- tryCatch(
    { 
     aa <<- aa -1 
     print(aa) 
     doc = htmlParse(url) 
     address= as.data.frame(xpathSApply(doc,'//div[@class="panel-body"]', xmlValue, encoding="UTF-8")) 
     page = cbind(address,url) 

     if (aa %in% from){ 
     pg = suppressMessages(melt(cc)) 
     write.csv(pg,paste("bcc_",aa,".csv")) 
     } 

} 
cc = lapply(url, func1) 

然而,当我这样做,我得到一个错误说对象“CC”是找不到的。我知道这可以使用for循环完成。但是有没有办法使用apply函数来完成这个任务。

+0

这是一个需要逗号的简单情况吗? 'lapply(url,func1)'不'lapply(url func1)'? – NJBurgo

+0

没有问题仍然存在,他们正试图调用一个在其环境中尚不存在的对象。如果他们要使用for循环(用户特别要求避免的),他们可以用'list()'初始化一个空白列表,将输出附加到这个循环内部的空白列表中,然后在cc达到正确值时保存输出长度。使用for循环将是更简单的解决方案。 – TJGorrie

+0

@ NJBurgo-不是逗号 – rrodrigorn0

回答

1

构建cc作为您的lapply之外的新环境对象。

e <- new.env() 
e$cc <- list() 
a <- letters[] 
b <- 1:26 
# Example lapply 
out <- lapply(a, function(a,b){ 
    e$cc[[a]] <- b 
    if(length(e$cc)%%10==0) print(length(e$cc)) 
    b # Giving an output to out aswell 
    },b 
) 
# [1] 10 
# [1] 20 
# Showing first elements of outputs 
# > e$cc 
#$a 
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
#[26] 26 
# > out 
#[[1]] 
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
#[26] 26 

这种方法可以让你建立cc然后可以列举中旬申请和将输出你的经典输出一个新的R环境中。虽然不是最优雅的解决方案。

n.b.此解决方案需要修改为您的代码。如果需要,还可以使用e$cc <- list()重置e $ cc,因为在运行之后它只会替换元素。

其他:(未测试!) 您可以尝试将您的脚本调整为如下所示。

func1 <- function(url){ 
    out <- tryCatch(
    { 
    doc <- htmlParse(url) 
    address <- as.data.frame(xpathSApply(
        doc,'//div[@class="panel-body"]', xmlValue, encoding="UTF-8") 
       ) 
     page <- cbind(address,url) 
    } 
} 
wrapfun <- function(urls){ 
    e <- new.env() 
    e$cc <- list() 
    lapply(urls, function(x){ 
    e$cc[[x]] <- func1(x) 
    if(length(e$cc)%%10==0){ # Change the %%y to how often you want to save e.g length(e$cc)%%100==0 would be every 100. 
     pg <- suppressMessages(melt(e$cc)) 
     write.csv(pg,paste("bcc_",length(e$cc),".csv")) 
    } 
    }) 
    return(e$cc) 
}