Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中定义新类型的for循环?_R - Fatal编程技术网

在R中定义新类型的for循环?

在R中定义新类型的for循环?,r,R,我正在尝试为R中的循环定义一个自定义的,或者如果可能的话 例子 有几样东西最好是 相当于ruby的东西,以及 一种完全忽略异常(不必)的for循环 是否有可能在R中定义一种新的for循环(如果有,如何定义),或者这是该语言固有的局限性,因此无法实现 用例 这里有一个随机的例子,说明了对于每一个带有索引的\u,如何简化挑剔的算法 假设我们想从网站上刮取第36到55篇文章,并将输出分配到列表中的某个位置。这很有效 library(rvest) library(dplyr) articles &l

我正在尝试为R中的循环定义一个自定义的
,或者如果可能的话

例子 有几样东西最好是

  • 相当于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