Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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_Variables_For Loop - Fatal编程技术网

在R中从循环中创建变量

在R中从循环中创建变量,r,variables,for-loop,R,Variables,For Loop,我认为我的问题对于普通的R用户来说非常简单 编辑: 我的例子可能是我真正问题的简化版本: 请参阅以下代码: library(markovchain) #create a new MC with transition matrix transitionMatrix mcStaticPool <- new("markovchain", states=c("perf", "def", "prep"), transitionMatrix=matrix(da

我认为我的问题对于普通的R用户来说非常简单

编辑: 我的例子可能是我真正问题的简化版本: 请参阅以下代码:

library(markovchain)

#create a new MC with transition matrix transitionMatrix
mcStaticPool <- new("markovchain", states=c("perf", "def", "prep"),
                    transitionMatrix=matrix(data=c(0.89715, 0.01475, 0.08810, 0, 1, 0, 0, 0, 1), 
                                            byrow=TRUE, nrow=3), name="StaticPool")
#display transition matrix
#print(mcStaticPool)
show(mcStaticPool)

#initially all loans are performing
initialState<-c(1,0,0)
nYears<-10

for(i in 1:nYears){
  afterNYears<-initialState*(mcStaticPool^i)
   print(afterNYears) 
}

以下循环:

for(i in 1:10){
  test<-2*(2^i)
  print(test) 
}
我想将其保存为一个变量,例如test2

我试过这个:

for(i in 1:10){
  test<-2*(2^i)
  test2 <- print(test) 
}
但我希望整个序列都在test2中:

[1] 4
[1] 8
[1] 16
[1] 32
[1] 64
[1] 128
[1] 256
[1] 512
[1] 1024
[1] 2048
谢谢, 致以最良好的祝愿


蒂姆

你只需这样做:

test2 <- 2^(2:11)

test2您只需执行以下操作:

test2 <- 2^(2:11)

test2一般规则:如果您发现自己在R中使用
for
循环,则很可能走错了路线;)

尽可能进行矢量化

test <- 2^2:11
或者,避免每次分配内存

test <- numeric(10)
for (i in 1:10)
    test[i] <- 2^(i+1)

test一般规则:如果您发现自己在R中使用了
for
循环,那么您很可能走错了路线;)

尽可能进行矢量化

test <- 2^2:11
或者,避免每次分配内存

test <- numeric(10)
for (i in 1:10)
    test[i] <- 2^(i+1)

test正如其他人提到的,您可以将其矢量化,但是如果您正在做一些更复杂的事情,而不是像这样进行矢量化,那么还有其他选项

当您的主要目标是基于每次迭代的结果创建向量(或矩阵或数组)时,通常使用sappy函数(或其他相关函数)而不是显式循环更好/更简单/更清晰/等等

例如:

test2 <- sapply(2:11, function(x) 2*(2^i))
test2库(microbenchmark)
> 

>out正如其他人提到的,您可以将其矢量化,但是如果您正在做一些更复杂的事情,而不是像这样进行矢量化,那么还有其他选择

当您的主要目标是基于每次迭代的结果创建向量(或矩阵或数组)时,通常使用sappy函数(或其他相关函数)而不是显式循环更好/更简单/更清晰/等等

例如:

test2 <- sapply(2:11, function(x) 2*(2^i))
test2库(microbenchmark)
> 

>请注意,OP正在执行
2*(2^i)
,而不是
(2^i)
。另外,不是
test@JuliánUrbano:不,不是,它将变量连接到自身。更正了公式:)据我所知,它通过串联创建一个新值,然后将该值赋给变量
test
,覆盖它以前的值,但使用更长的数组:因此本质上test等于[2],然后是[2,4],然后是[2,4,8],依此类推。应该不鼓励
c(test,2^I)
方法。这需要在每次迭代中分配一个新的(更大的)向量。最好预先分配最终大小的向量,然后分配到向量中。请注意,OP执行的是
2*(2^i)
,而不是
(2^i)
。另外,不是
test@JuliánUrbano:不,不是,它将变量连接到自身。更正了公式:)据我所知,它通过串联创建一个新值,然后将该值赋给变量
test
,覆盖它以前的值,但使用更长的数组:因此本质上test等于[2],然后是[2,4],然后是[2,4,8],依此类推。应该不鼓励
c(test,2^I)
方法。这需要在每次迭代中分配一个新的(更大的)向量。最好预先分配最终大小的向量,然后分配到向量中。你不能在一个向量中拥有所有这些。你是说数据帧吗?可能有三个向量,分别对应于
perf
def
prep
?可能我不清楚,我只是想把百分比作为一个向量。应该是这样的:c(0.0881, 0.89715, 0.01475, 0.1671389, 0.8048781, 0.02798296, 0.2380487, 0.7220964, 0.03985491, 0.3016654, 0.6478288, 0.05050584, 0.3587391, 0.5811996, 0.06006131, 0.4099428, 0.5214232, 0.06863401, 0.4558802, 0.4677948, 0.076325, 0.4970929, 0.4196821, 0.08322497, 0.5340669, 0.3765178, 0.08941528, 0.5672381, 0.337793, 0.09496892)你不可能在一个向量中包含所有这些。你是说一个数据帧吗?可能有三个向量,分别对应于
perf
def
prep
?可能我不清楚,我只想要百分比作为一个向量。应该如下所示:c(0.0881, 0.89715, 0.01475, 0.1671389, 0.8048781, 0.02798296, 0.2380487, 0.7220964, 0.03985491, 0.3016654, 0.6478288, 0.05050584, 0.3587391, 0.5811996, 0.06006131, 0.4099428, 0.5214232, 0.06863401, 0.4558802, 0.4677948, 0.076325, 0.4970929, 0.4196821, 0.08322497, 0.5340669, 0.3765178, 0.08941528, 0.5672381, 0.337793, 0.09496892)
test2 <- sapply(2:11, function(x) 2*(2^i))
> library(microbenchmark)
> 
> out <- microbenchmark( 
+   bad={test2 <- NULL; for(i in 1:10000) test2 <- c(test2,2*(2^i))},
+   good={test2 <- numeric(10000); for(i in 1:10000) test2[i] <- 2*(2^i) },
+   better={test2=sapply(1:10000, function(x) 2*(2^x))},
+   best={test2=2*(2^(1:10000))} )
> out
Unit: microseconds
   expr        min          lq     median         uq        max neval
    bad 172508.454 174738.8165 176630.910 197765.369 211581.875   100
   good  26387.491  27683.0960  28150.475  28567.769  52588.194   100
 better  20645.118  21288.8155  22140.853  23022.652  49513.799   100
   best    719.234    763.1595    768.086    773.628   1622.381   100
> plot(out)
>