2016-08-02 2 views
1

lapply関数の中にファイルを書く必要があります。私はWebページの大きなリストを削っているので、100分ごとに出力を保存したいと思います。私はこれを行うとき、私はオブジェクト「cc」が言ってエラーを取得し、しかし、次のコード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) 

を使用して発見されません。これはforループを使って行うことができます。しかし、apply関数を使用してこのタスクを達成する方法があります。

+0

カンマが必要なのは簡単なケースですか? 'lapply(url、func1)'ではなく 'lapply(url func1)'ですか? – NJBurgo

+0

まだ環境内に存在しないオブジェクトを呼び出そうとしているという問題はありません。 forループ(ユーザが特に避けようとしている)を使うのであれば、空リストを 'list()'で初期化し、ループ内の空リストに出力を追加して、ccが正しいときに出力を保存することができます長さforループを使う方が簡単です。 – TJGorrie

+0

@ NJBurgo-それはコンマではない – rrodrigorn0

答えて

1

lapply以外の新しい環境オブジェクトとしてccをビルドします。

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 

このような方法は、あなたがして、適用ミッド列挙して出力するであろうあなたの古典出力することができ、新たなR環境内ccを構築することができます。しかし、最もエレガントなソリューションではありません。

n.b.このソリューションは、コードに合わせて変更する必要があります。必要に応じてe $ ccをe$cc <- list()にリセットしてください。一度実行すると、要素が置き換えられます。

代替:(未テスト!) あなたのスクリプトをこのようなものに改造してみてください。

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) 
} 
関連する問題