在R中定义新类型的for循环?
我正在尝试为R中的循环定义一个自定义的在R中定义新类型的for循环?,r,R,我正在尝试为R中的循环定义一个自定义的,或者如果可能的话 例子 有几样东西最好是 相当于ruby的东西,以及 一种完全忽略异常(不必)的for循环 是否有可能在R中定义一种新的for循环(如果有,如何定义),或者这是该语言固有的局限性,因此无法实现 用例 这里有一个随机的例子,说明了对于每一个带有索引的\u,如何简化挑剔的算法 假设我们想从网站上刮取第36到55篇文章,并将输出分配到列表中的某个位置。这很有效 library(rvest) library(dplyr) articles &l
,或者如果可能的话
例子
有几样东西最好是
- 相当于ruby的东西,以及
- 一种完全忽略异常(不必)的
for
循环
是否有可能在R中定义一种新的for循环(如果有,如何定义),或者这是该语言固有的局限性,因此无法实现
用例
这里有一个随机的例子,说明了对于每一个带有索引的\u,如何简化挑剔的算法
假设我们想从网站上刮取第36到55篇文章,并将输出分配到列表中的某个位置。这很有效
library(rvest)
library(dplyr)
articles <- vector(mode = "list", length = 20)
for(i in 36:55) {
paste0("Scraping article ", i) %>% print
articles[[i - 35]] <- read_html(paste0("http://afr.herokuapp.com/articles/", i)) %>%
html_nodes("p") %>% html_text %>% paste0(collapse="/n")
}
通过对每个具有索引的单元使用,我们避免了繁琐的算法。这个例子非常简单,但当复杂性出现一些变化时,例如当我们有各种条件、嵌套循环等时,事情会变得更加复杂,这些看起来很小的清晰性改进会变得更加深刻
最好避免R中的for循环,尤其是主循环
计算R中的循环是通过Lappy,
赛普利,马普利,塔普利。这些都是灵活的,可以定制的
将您自己的函数传递给它们
请看一下try()函数,您可以使用它来包装代码。如果将参数“silent”设置为true,则会忽略错误
谢谢你举个例子。@HubertL的解决方案是正确的方法。在这种情况下不需要索引。如果您真的想将索引传递给Lappy而不是实际的页码,这可以很容易地做到:
my_scraper <- function(article_id){
paste0("Scraping article ", article_id) %>% print
read_html(paste0("http://afr.herokuapp.com/articles/", article_id + 35)) %>%
html_nodes("p") %>%
html_text %>%
paste0(collapse="/n")}
articles <- lapply(1:20, my_scraper)
my_scraper%打印
读取html(粘贴0(“http://afr.herokuapp.com/articles/“,第_id+35)条%>%
html_节点(“p”)%>%
html_文本%>%
粘贴0(collapse=“/n”)}
文章
最好避免R中的for循环,尤其是主循环
计算R中的循环是通过Lappy,
赛普利,马普利,塔普利。这些都是灵活的,可以定制的
将您自己的函数传递给它们
请看一下try()函数,您可以使用它来包装代码。如果将参数“silent”设置为true,则会忽略错误
谢谢你举个例子。@HubertL的解决方案是正确的方法。在这种情况下不需要索引。如果您真的想将索引传递给Lappy而不是实际的页码,这可以很容易地做到:
my_scraper <- function(article_id){
paste0("Scraping article ", article_id) %>% print
read_html(paste0("http://afr.herokuapp.com/articles/", article_id + 35)) %>%
html_nodes("p") %>%
html_text %>%
paste0(collapse="/n")}
articles <- lapply(1:20, my_scraper)
my_scraper%打印
读取html(粘贴0(“http://afr.herokuapp.com/articles/“,第_id+35)条%>%
html_节点(“p”)%>%
html_文本%>%
粘贴0(collapse=“/n”)}
文章在@Cole comment上展开,正如@bigfindger在他们的回答中提到的,当你需要for
循环时,你“总是”应该考虑lappy
:
library(rvest)
library(dplyr)
my_scraper <- function(article_id){
paste0("Scraping article ", article_id) %>% print
read_html(paste0("http://afr.herokuapp.com/articles/", article_id)) %>%
html_nodes("p") %>%
html_text %>%
paste0(collapse="/n")}
articles <- lapply(36:55, my_scraper)
库(rvest)
图书馆(dplyr)
我的刮刀%print
读取html(粘贴0(“http://afr.herokuapp.com/articles/“,第_条id))%>%
html_节点(“p”)%>%
html_文本%>%
粘贴0(collapse=“/n”)}
文章在@Cole comment上展开,正如@bigfindger在他们的回答中提到的,当你需要for
循环时,你“总是”应该考虑lappy
:
library(rvest)
library(dplyr)
my_scraper <- function(article_id){
paste0("Scraping article ", article_id) %>% print
read_html(paste0("http://afr.herokuapp.com/articles/", article_id)) %>%
html_nodes("p") %>%
html_text %>%
paste0(collapse="/n")}
articles <- lapply(36:55, my_scraper)
库(rvest)
图书馆(dplyr)
我的刮刀%print
读取html(粘贴0(“http://afr.herokuapp.com/articles/“,第_条id))%>%
html_节点(“p”)%>%
html_文本%>%
粘贴0(collapse=“/n”)}
文章该软件包提供了一个模型
res = foreach(i = 1:3) %do% {
sqrt(i)
}
这是使用R%any%
构造,这是一个可以由用户定义的中缀运算符,因此
`%with_index%` <- function(lhs, rhs) {
## implement ...
Map(function(i) {
list(i, rhs(lhs[[i]]))
}, seq_along(lhs))
}
1:10 %with_index% sqrt
`%with_index%`该包提供了一个模型
res = foreach(i = 1:3) %do% {
sqrt(i)
}
这是使用R%any%
构造,这是一个可以由用户定义的中缀运算符,因此
`%with_index%` <- function(lhs, rhs) {
## implement ...
Map(function(i) {
list(i, rhs(lhs[[i]]))
}, seq_along(lhs))
}
1:10 %with_index% sqrt
`%with_index%`您可以使用此函数:
对于索引项为2的_,其值为8
#>条目3是9
如果您想使用类似的语法,这会有点困难,因为您无法修改解析器。然而,在解析之后,for循环只是函数调用,所以如果您能够确定在调用中放置索引的位置,那么仍然可以这样做。一种方法可能是这样写:
(i在{7:9;j})中的
类别(“条目”,j,“是”,i,“\n”)
这是合法的语法,但在标准循环中它不起作用,因为{7:9;j}
的计算结果与j
相同,这不是您想要的。但您可以编写自己的for循环函数来处理它:
`对于`,您可以使用以下函数:
对于索引项为2的_,其值为8
#>条目3是9
如果您想使用类似的语法,这会有点困难,因为您无法修改解析器。然而,在解析之后,for循环只是函数调用,所以如果您能够确定在调用中放置索引的位置,那么仍然可以这样做。一种方法可能是这样写:
(i在{7:9;j})中的
类别(“条目”,j,“是”,i,“\n”)
这是合法的语法,但在标准循环中它不起作用,因为{7:9;j}
的计算结果与j
相同,这不是您想要的。但您可以编写自己的for循环函数来处理它:
`对于`@chinsoon12,我用一个例子更新了这个问题。对不起,这是一个很长的。我希望它有意义参见lappy(36:55,函数(I){read_html(paste0(…)})
我看不出I+35
比I-35
更不挑剔。本质上的区别不是I+35和I-35之间的区别,而是使用for循环和not循环之间的区别。For循环在R中效率很低,涉及大量不必要的复制。它们可以在少量字符串上循环,但如果必须对数十万条记录进行计算,for循环将破坏您的性能。@bigfindger是错误的:for循环并不是特别低效。与其他控件构造(if、while等)一样,它们是内部函数调用,仅使用s