如何在R编程中启动for循环

时间:2010-11-12 07:09:20

标签: r

我是编程的新手,我编写了一个代码,可以找到第一封电子邮件的垃圾邮件,但我想编写一个for循环来为所有电子邮件执行此操作。任何帮助,将不胜感激。谢谢。

words = grepl("viagra", spamdata[[ 1 ]]$header[ "Subject"])

2 个答案:

答案 0 :(得分:15)

我认为您想循环遍历spamdata的元素并构建一个指示符,指示是否在电子邮件的主题行中找到字符串"viagra"

让我们设置一些虚拟数据用于说明目的:

subjects <- c("Buy my viagra", "Buy my Sildenafil citrate",
              "UK Lottery Win!!!!!")
names(subjects) <- rep("Subject", 3)
spamdata <- list(list(Header = subjects[1]), list(Header = subjects[2]),
                 list(Header = subjects[3]))

接下来,我们创建一个向量words来保存循环的每次迭代的结果。您不希望在每次迭代中增加words或任何其他对象 - 这将强制复制并将减慢您的循环。而是在开始之前分配存储 - 这里使用我们想要循环的列表的长度:

words <- logical(length = length(spamdata))

您可以设置循环

## seq_along() creates a sequence of 1:length(spamdata) 
for(i in seq_along(spamdata)) {
    words[ i ] <- grepl("viagra", spamdata[[ i ]]$Header["Subject"])
}

然后我们可以查看words

> words
[1]  TRUE FALSE FALSE

这与我们从制作科目中所知道的相符。

注意我们如何使用i作为123的占位符 - 在循环的每次迭代中,i接受序列123中的下一个值,因此我们可以i)访问i的{​​{1}}组件以获取下一个主题行, ii)访问spamdata的{​​{1}}元素,以存储i电话的结果。

请注意,我们还可以使用wordsgrepl()函数代替隐式循环,这些函数为您创建循环,但可能需要一些工作来编写自定义函数。我们可以编写一个包装器,而不是直接使用sapply()

lapply()

在上面的函数中,我们使用grepl()而不是列表名称foo <- function(x) { grepl("viagra", x$Header["Subject"]) } ,因为当xspamdata遍历lapply()列表时,各个组件(由sapply()循环中的spamdata引用)作为参数spamdata[[i]]传递给我们的函数,因此我们只需要在for()调用中引用x

这就是我们如何在xgrepl()中使用我们的包装函数foo(),首先是lapply()

sapply()

lapply()将尽可能简化返回的对象,如下所示:

> lapply(spamdata, foo)
[[1]]
[1] TRUE

[[2]]
[1] FALSE

[[3]]
[1] FALSE

除此之外,他们的工作方式相似。

注意我们可以让我们的包装函数sapply()更有用,它允许它定义一个参数来定义你想要搜索的垃圾邮件:

> sapply(spamdata, foo)
[1]  TRUE FALSE FALSE

我们可以使用foo()foo <- function(x, string) { grepl(string, x$Header["Subject"]) } 向我们的函数传递额外的参数:

lapply()

您会发现最有用的(sapply()循环或> sapply(spamdata, foo, string = "viagra") [1] TRUE FALSE FALSE > sapply(spamdata, foo, string = "Lottery") [1] FALSE FALSE TRUE for()版本)将取决于您的编程背景以及您最熟悉的编程背景。有时lapply()使用起来更容易,更简单,但也许更冗长(这并不总是坏事!),而sapply()for()非常简洁有用。我需要跳过箍来创建一个可行的包装函数。

答案 1 :(得分:0)

在R中,循环使用此形式,其中variable是迭代变量的名称,sequence是一个向量或值列表:

for(序列中的变量)表达式

表达式可以是单个R命令 - 或用大括号括起来的几行命令:

for (variable in sequence) { 
    expression
    expression
    expression
}

在这种情况下,它将用于(单词){做你想做的任何事情}

基本循环理论

循环命令的基本结构是:for(i in 1:n){stuff to do},其中n是循环执行的次数。

listname[[1]]引用列表“listname。”中的第一个元素。

在for循环中,listname[[i]]引用对应于for循环的第i次迭代的变量。

代码for(i in 1:length(yesnovars))告诉循环只对列表中的每个变量执行一次。

  

从以下答案中获取答案   来源:
  Loops in R
  Programming in R