我是编程的新手,我编写了一个代码,可以找到第一封电子邮件的垃圾邮件,但我想编写一个for循环来为所有电子邮件执行此操作。任何帮助,将不胜感激。谢谢。
words = grepl("viagra", spamdata[[ 1 ]]$header[ "Subject"])
答案 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
作为1
,2
和3
的占位符 - 在循环的每次迭代中,i
接受序列1
,2
,3
中的下一个值,因此我们可以i)访问i
的{{1}}组件以获取下一个主题行, 和 ii)访问spamdata
的{{1}}元素,以存储i
电话的结果。
请注意,我们还可以使用words
或grepl()
函数代替隐式循环,这些函数为您创建循环,但可能需要一些工作来编写自定义函数。我们可以编写一个包装器,而不是直接使用sapply()
:
lapply()
在上面的函数中,我们使用grepl()
而不是列表名称foo <- function(x) {
grepl("viagra", x$Header["Subject"])
}
,因为当x
和spamdata
遍历lapply()
列表时,各个组件(由sapply()
循环中的spamdata
引用)作为参数spamdata[[i]]
传递给我们的函数,因此我们只需要在for()
调用中引用x
。
这就是我们如何在x
或grepl()
中使用我们的包装函数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