2016-08-02 6 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) 

Однако, когда я делаю это я получаю ошибку говоря объект «сс» не найден. Я знаю, что это можно сделать, используя цикл for. Но есть ли способ выполнить эту задачу, используя функцию apply.

+0

Это простой случай, когда требуется запятая? 'lapply (url, func1)' не 'lapply (url func1)'? – NJBurgo

+0

Нет проблемы, поскольку они пытаются вызвать объект, который еще не существует в их среде. Если бы они использовали цикл for (который пользователи специально просили избежать), они могли бы инициализировать пустой список с помощью 'list()', добавлять выходы в пустой список внутри такого цикла и затем сохранять вывод, когда cc достигает правильного длина. Использование цикла for было бы более легким решением. – TJGorrie

+0

@ NJBurgo- не это не запятая – rrodrigorn0

ответ

1

Build 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 с e$cc <- list(), если потребуется, так как после запуска один раз он будет заменять только элементы.

ALTERNATIVELY: (UNTESTED!) Вы можете попробовать адаптировать свой сценарий к чему-то подобному.

Смежные вопросы