2

我得出的结论是,R 专家不太喜欢循环。然而,作为一名前 Java 程序员,这个事实对我来说有点苛刻。

我想动态创建 5 个变量:x1x2、和x3,并为每个变量分配一个随机值。x4x5

> i = 1
> 
> while(i <= 5)
 {
   assign(paste("x", i, sep = ""), rnorm(1))
   i = i + 1       
 }
> x1
[1] 0.3853609
> x2
[1] 1.626055
> x3
[1] -1.043699
> x4
[1] 0.3449921
> x5
[1] -0.9768416

好吧,这使用了一个while循环,我正在寻找这样做的 R 方式。我试过了:

assign(paste("x", 1:5, sep=""), rnorm(1)

这给出了一个错误。我究竟做错了什么?

4

4 回答 4

10

R是矢量化的。做就是了..

x <- rnorm(5)
[1] -1.285847248  0.285534550  0.001136893  0.167311756 -1.420379168

[使用(列表使用[[函数对列表元素进行子集化)访问每个元素。要获得第 5 个值...

x[5]
[1] -1.420379

这是基本的 R 功能。我建议您阅读标签 wiki的R 信息页面上的教程。

于 2013-08-09T09:40:45.280 回答
4

这是一种更 R 的方式来做到这一点,

lval = as.list(rnorm(5))
names(lval) = paste0("x", seq_along(lval))

attach(lval) # if you really need those free variables in the workspace
于 2013-08-09T11:30:54.470 回答
3

有时不使用循环比使用它们更循环。

parse将处理多个表达式,那么为什么不使用它呢?构造一个赋值调用向量,并使用它们:

> i=1:5
> s=paste("x",i,"<-rnorm(1)",sep="")
> eval(parse(text=s))
> ls()
[1] "i"  "s"  "x1" "x2" "x3" "x4" "x5"
> x1
[1] -0.6467902
> x2
[1] 1.376682

但是这种东西在实际代码中是没有的,你可能想在幕后使用它来为教学示例生成变量,但为了 PETE 的缘故,不要向孩子们展示这个!

于 2013-08-09T10:29:54.963 回答
2

为避免函数未向量化时出现显式循环,您可以使用应用类型函数,例如:

sapply(1:5, function(i){assign(paste("x", i, sep = ""), rnorm(1), pos = 1)})

或使用 对函数进行矢量化Vectorize,例如:

assign.vect <- Vectorize(assign, vectorize.args = c("x","value"))
assign.vect(paste("x", 1:5, sep=""), rnorm(5), pos = 1)
于 2013-08-09T10:08:32.743 回答