[英]how to start a for loop in R programming
我是编程的新手,我写了一个代码来查找第一封电子邮件中的垃圾邮件,但是我想编写一个for循环,对所有电子邮件都执行此操作。 任何帮助,将不胜感激。 谢谢。
words = grepl("viagra", spamdata[[ 1 ]]$header[ "Subject"])
我假设您想遍历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
的个分量spamdata
以获得下一个主题行, 并且 ii)访问words
第i
个元素以存储grepl()
调用的结果。
请注意,除了隐式循环,我们还可以使用sapply()
或lapply()
函数,它们为您创建了循环,但可能需要一些工作来编写自定义函数。 代替直接使用grepl()
,我们可以编写包装器:
foo <- function(x) {
grepl("viagra", x$Header["Subject"])
}
在上面的函数中,我们使用x
代替列表名称spamdata
因为当lapply()
和sapply()
在spamdata
列表上循环时,各个组件(由for()
循环中的spamdata[[i]]
引用)传递给我们的函数作为参数x
因此我们只需要在grepl()
调用中引用x
。
这就是我们可以在lapply()
或sapply()
首先使用lapply()
情况下使用包装函数foo()
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()
更易于使用和简单,但可能更冗长(这并不总是一件坏事!),而lapply()
和sapply()
则非常简洁实用,在您不需要跳过篮球的情况下创建一个可行的包装函数。
在R中,采用这种形式,其中variable是迭代变量的名称,而sequence是向量或值列表:
用于(顺序可变)表达式
该表达式可以是单个R命令-或用大括号括起来的几行命令:
for (variable in sequence) {
expression
expression
expression
}
在这种情况下,for(words){做您想做的事}
也
基本循环理论
循环命令的基本结构为: for(i in 1:n){stuff to do}
,其中n是循环将执行的次数。
listname[[1]]
引用列表“ listname”中的第一个元素。
在for循环中, listname[[i]]
是指与for循环的第i次迭代相对应的变量。
for(i in 1:length(yesnovars))
告诉循环仅对列表中的每个变量执行一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.