Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中不再有循环_R_Loops - Fatal编程技术网

R中不再有循环

R中不再有循环,r,loops,R,Loops,我得出的结论是R专家不太喜欢循环;然而,作为一名前java程序员,这个事实对我来说有点苛刻 我想动态创建5个变量:x1、x2、x3、x4和x5,并为每个变量分配一个随机值 > 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]

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

我想动态创建5个变量:
x1
x2
x3
x4
x5
,并为每个变量分配一个随机值

> 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

这是一个错误。我做错了什么?

R是矢量化的。就这么办

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

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

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

sapply(1:5, function(i){assign(paste("x", i, sep = ""), rnorm(1), pos = 1)})
assign.vect <- Vectorize(assign, vectorize.args = c("x","value"))
assign.vect(paste("x", 1:5, sep=""), rnorm(5), pos = 1)
或使用
矢量化
对函数进行矢量化,例如:

sapply(1:5, function(i){assign(paste("x", i, sep = ""), rnorm(1), pos = 1)})
assign.vect <- Vectorize(assign, vectorize.args = c("x","value"))
assign.vect(paste("x", 1:5, sep=""), rnorm(5), pos = 1)

assign.vect有时不使用循环比使用循环更容易出错

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
>i=1:5

>s=粘贴(“x”,i,”这里有一个更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

我不认为
assign
是矢量化的,所以你必须在
assign
中使用循环。但是不要在这里使用
assign
。这不是必须的。你的问题是你认为你需要5个变量。你只需要一个包含5个值的变量。我们喜欢循环,并且一直都在使用它们。不管怎样,只要我们需要它们。你的finA<代码>赋值< /代码>行不会出错,它在那里等待一个结束括号。您可能想阅读网站的各部分,以帮助您获得堆栈溢出的最大值。如果下面的答案之一解决了您的问题,您可能会考虑进行投票和/或标记它被接受来显示问题。通过勾选合适答案旁边的绿色小复选标记来回答。您没有义务这样做,但这有助于保持网站没有未回答的问题,并奖励那些花时间解决您问题的人。+1表示您第二次使用矢量化。我很想-1表示您首次使用
sapply
应用
族被设计用于其返回值,而不是副作用。这正是
for
的设计目的-用于其副作用,而不是其返回值(即循环最后一次求值后迭代器的值).
*apply
函数是循环。我甚至会称它们为显式循环。@Roland,我的意思当然是“显式”的意思,即为
使用显式编写
。SimonO101,回答的目的是提供两种方法来避免一般意义上的“显式”循环,并以问题的具体问题为例加以说明这不是最合适的情况。有人可能会说存储5个变量不是最好的选择,更喜欢向量(你在答案中建议的链接)或列表。
sapply
是一个显式循环,你使用它的方式不对。关于最后一句话:我想你就是这么做的。;)