我想知道某人是否会如此善良并尽可能地提出改进建议:
ContactAuto2 <- function(x) {
tryCatch({
tabs <- getURL(paste("http://google.de/",x,sep=""))
xmltext <- htmlParse(tabs,encoding = "UTF-8", asText=TRUE)
xmltable <- xpathApply(xmltext, "//adresse/text()[preceding-sibling::br]",xmlValue)
val <- gsub("\r\n","",xmltable)
val2 <- gsub("(\\D)([0-9])","\\1 \\2",val)
FinalValue <- str_trim(val2)
}, error=function(e) cat())
}
Base <- lapply(url1, ContactAuto2)
如果我使用sapply(url1, ContactAuto2)
,速度有所改善,但数据布局不佳。
有没有办法提高速度?与lapply
相比,为什么sapply
这么慢?
我希望你只是浏览并提出建议,因为没有真正可行的完整例子。
答案 0 :(得分:1)
首先,请阅读?Rprof
。它是一个速度分析器,它将为您提供功能中每个单独执行的运行时间表,从而可以轻松查看速度问题的位置。
这是(我的第一个)建议。
tabs <- getURL(paste("http://google.de/",x,sep=""))
谷歌是一个庞大的搜索引擎,取决于你正在搜索的内容,&#34;谷歌搜索&#34;每次迭代都可能耗费大量时间。此外,您将paste
嵌套在下载信息的功能中。虽然它可能不在您的函数中,但嵌套函数调用几乎总是会减慢速度。在调用getURL
之前考虑粘贴。另外,在这种情况下,我会使用paste0
代替paste
。
system.time(replicate(1e6, paste('a', 'b', sep = '')))
## user system elapsed
## 5.864 0.000 5.679
system.time(replicate(1e6, paste0('a', 'b')))
## user system elapsed
## 3.98 0.00 3.82
在不知道xmltable
的样子的情况下,我不能做得更远。您能为我们提供一些示例网址来测试您的功能吗?