楼主: kk22boy
148378 28

[程序分享] R语言编程入门之六:循环与条件 [推广有奖]

  • 8关注
  • 95粉丝

一叶知秋

学科带头人

51%

还不是VIP/贵宾

-

TA的文库  其他...

计量经济与统计

SSCI、权威 论文写作及投稿经验

威望
1
论坛币
56594 个
通用积分
128.9629
学术水平
437 点
热心指数
492 点
信用等级
393 点
经验
67522 点
帖子
1589
精华
0
在线时间
2188 小时
注册时间
2005-3-10
最后登录
2024-4-2

初级热心勋章 初级信用勋章

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
循环
for (n in x) {expr}
R中最基本的是for循环,其中n为循环变量,x通常是一个序列。n在每次循环时从x中顺序取值,代入到后面的expr语句中进行运算。下面的例子即是以for循环计算30个Fibonacci数。
x <- c(1,1)
for (i in 3:30) {
    x <- x[i-1]+x[i-2]
}

while (condition) {expr}
当不能确定循环次数时,我们需要用while循环语句。在condition条件为真时,执行大括号内的expr语句。下面即是以while循环来计算30个Fibonacci数。
x <- c(1,1)
i <- 3
while (i <= 30) {
    x <- x[i-1]+x[i-2]
    i <- i +1
}



条件
if (conditon) {expr1} else {expr2}
if语句用来进行条件控制,以执行不同的语句。若condition条件为真,则执行expr1,否则执行expr2。ifesle()函数也能以简洁的方式构成条件语句。下面的一个简单的例子是要找出100以内的质数。
x <- 1:100
y <- rep(T,100)
for (i in 3:100) {
    if (all(i%%(2:(i-1))!=0)){
        y <- TRUE
        } else {y <- FALSE
                }
}
print(x[y])

在上面例子里,all()函数的作用是判断一个逻辑序列是否全为真,%%的作用是返回余数。在if/else语句中一个容易出现的错误就是else没有放在}的后面,若你执行下面的示例就会出现错误。
logic = 3
x<- c(2,3)
if (logic == 2){
    y <- x^2
}
else {
  y<-x^3
}
show(y)

一个例子
本例来自于"introduction to Scientific Programming and Simulatoin Using R"一书的习题。有这样一种赌博游戏,赌客首先将两个骰子随机抛掷第一次,如果点数和出现7或11,则赢得游戏,游戏结束。如果没有出现7或11,赌客继续抛掷,如果点数与第一次扔的点数一样,则赢得游戏,游戏结束,如果点数为7或11则输掉游戏,游戏结束。如果出现其它情况,则继续抛掷,直到赢或者输。用R编程来计算赌客赢的概率,以决定是否应该参加这个游戏。

craps <- function() {
    #returns TRUE if you win, FALSE otherwise
    initial.roll <- sum(sample(1:6,2,replace=T))
    if (initial.roll == 7 || initial.roll == 11) return(TRUE)
    while (TRUE) {
        current.roll <- sum(sample(1:6,2,replace=T))
        if (current.roll == 7 || current.roll == 11) {
            return(FALSE)
        } else if (current.roll == initial.roll) {
            return(TRUE)
        }
    }
}
mean(replicate(10000, craps()))

从最终结果来看,赌客赢的概率为0.46,长期来看只会往外掏钱,显然不应该参加这个游戏了。最后要说的是,本题也可以用递归来做。
By 写长城的诗
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言编程 语言编程 编程入门 R语言 Fibonacci 语言编程

已有 4 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 鼓励积极发帖讨论
crystal8832 + 10 + 1 + 1 + 1 根据规定进行奖励
李会超 + 60 + 40 观点有启发
epoh + 5 + 5 + 5 对论坛有贡献

总评分: 经验 + 60  论坛币 + 50  学术水平 + 9  热心指数 + 9  信用等级 + 9   查看全部评分

如果该贴对您有些许帮助,希望你能回复一下或者评一下热心指数!谢谢!
沙发
complicated 在职认证  发表于 2013-3-22 14:36:18 |只看作者 |坛友微信交流群
赞专项的基础普及,简单快速针对性强!
密码被盗??

使用道具

R语言里面的循环语句,常常不能循环到底,这是为什么呢?怎么处理呢?

使用道具

板凳
诶嘿~ 发表于 2014-9-11 11:40:05 |只看作者 |坛友微信交流群
为什么我按照您的for (n in x) {expr}代码输进去 不能出来30个Fibonacci数啊,好像是NA

使用道具

报纸
sisterlove73 学生认证  发表于 2014-12-25 10:31:36 |只看作者 |坛友微信交流群
诶嘿~ 发表于 2014-9-11 11:40
为什么我按照您的for (n in x) {expr}代码输进去 不能出来30个Fibonacci数啊,好像是NA
正确程序
x <- c(1,1)
for (i in c(3:30)) {
  x
<- x[i-1]+x[i-2]
}
x

x <- c(1,1)
i <- 3
while (i <= 30) {
    x
<- x[i-1]+x[i-2]
    i <- i +1
}
x


使用道具

地板
sisterlove73 学生认证  发表于 2014-12-25 10:37:02 |只看作者 |坛友微信交流群
sisterlove73 发表于 2014-12-25 10:31
正确程序
x
上面那个正确程序,x后面应该有才对,我不知道为什么发不上去

使用道具

7
woshizsz 发表于 2015-1-6 20:12:15 |只看作者 |坛友微信交流群
问一个问题
我陷入死循环了,如何强制退出..............
谢谢大神

使用道具

8
jacky陈2183 在职认证  学生认证  发表于 2015-1-22 22:33:14 |只看作者 |坛友微信交流群

使用道具

9
墨名 发表于 2015-2-25 14:45:51 |只看作者 |坛友微信交流群
woshizsz 发表于 2015-1-6 20:12
问一个问题
我陷入死循环了,如何强制退出..............
谢谢大神
按“中断当前的计算”按钮即可

使用道具

10
墨名 发表于 2015-2-25 14:46:50 |只看作者 |坛友微信交流群
sisterlove73 发表于 2014-12-25 10:37
上面那个正确程序,x后面应该有才对,我不知道为什么发不上去
上面那个仍然不是正确的程序,应该是x<- x[i-1]+x[i-2]才对

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 09:09