if(condition) true_expression else false_expression
if(condition) expression
因为表达式expression, true_expression, false_expression并非总是被执行,因此if函数的类型是special
> typeof(`if`) [1] "special"
在R中.条件语句不是向量型运算
如果条件语句是由一个以上的逻辑值组成的向量,那么执行语句时只会用到向量中的第一个元素
x = 10 y = c(8, 10, 12, 3, 17) if(x < y){ x }else{ y }
[1] 8 10 12 3 17 Warning message: In if (x < y) { : the condition has length > 1 and only the first element will be used
想要向量化操作需要使用ifelse函数
> ifelse(x < y, x, y) [1] 8 10 10 3 10
switch函数
swithcheroo.swith = function(x){ switch(x, a = "alligator", b = "bear" , c = "camel", "moose") }
> swithcheroo.swith("a") [1] "alligator" > swithcheroo.swith("f") [1] "moose"
循环语句
repeat
创建交互应用程序时用到
for
用于遍历向量/列表的每一个项目
for(var in list) expression
循环内的计算结果不打印在屏幕上,除非显式地调用print var变量在命令环境中是变化的循环扩展
迭代器iterators
通过扩展包iterators实现迭代器iterators
install.packages("iterators")
迭代器可以返回向量,数组,数据框或者其他对象的元素,甚至返回某个函数返回的值
iter函数创建迭代器:
参数:iter(obj, checkFunc = function(...) T, recycle = F, ...)
obj:指定对象 by: chunksize: checkFunc:指定一个过滤迭代器返回值的函数 recycle:指定当对象元素迭代完之后是否对迭代进行重置 ...:nextElem函数:查看下一个迭代项,这个函数会隐式地调用 checkFunc
如果下一个值符合checkFunc,则返回该值
如果不符合,函数将试着返回另外一个值.nextElem函数会继续检查其他值,直到找到一个符合checkFunc的值.如果所有值都迭代完毕,没有元素符合,迭代器会调用停止命令,并返回StopIteration
library(iterators) oneoffive = iter(1:5) > nextElem(oneoffive) [1] 1 > nextElem(oneoffive) [1] 2 > nextElem(oneoffive) [1] 3 > nextElem(oneoffive) [1] 4 > nextElem(oneoffive) [1] 5 > nextElem(oneoffive) Error: StopIteration
foreach循环
通过foreach包实现foreach循环
install.packages("foreach")
foreach能够循环遍历某个对象(向量,矩阵,数据框或者迭代器)中的多个元素 ,针对各个元素执行表达式,并返回结果
在foreach函数内部,将元素指定一个临时值,与在for循环中的操作类似
function (..., .combine, .init, .final = NULL, .inorder = TRUE, .multicombine = FALSE, .maxcombine = if (.multicombine) 100 else 2, .errorhandling = c("stop", "remove", "pass"), .packages = NULL, .export = NULL, .noexport = NULL, .verbose = FALSE)
foreach函数返回一个foreach对象
想要真正地执行循环,需要使用
%do%:顺序执行表达式 或%dopar%:并行执行表达式library(foreach) sqrts.1to5 = foreach(i = 1:5) %do% sqrt(i) sqrts.1to5 [[1]] [1] 1 [[2]] [1] 1.414214 [[3]] [1] 1.732051 [[4]] [1] 2 [[5]] [1] 2.236068