2017-01-14 64 views
0

我對R非常陌生,但我只是想對向量Y中的元素做一個簡單的條件重新分配。但是,當重新分配處理積分時,我總是收到警告消息。下面是完整的代碼:警告消息將值重新分配給R中的積分?

> rm(list=ls()) 
> Y <- c() 
> for (k in 1:20) { 
+ Y[k] <- k 
+ } 
> for (k in 1:20) { 
+ if (Y[k] < 12) { 
+  Y[k] <- cos(3 * k) 
+ } else { 
+  Y[k] <- integrate(function(t) sqrt(t), lower = 0, upper = k) 
+ } 
+ } 

一個警告消息:

Warning messages: 
1: In Y[k] <- integrate(function(t) sqrt(t), lower = 0, upper = k) : 

數量的項目替換的是不是更換長度的倍數

並且返回的Y: [ 1]] [1] -0.9899925

[[2]] 
[1] 0.9601703 

[[3]] 
[1] -0.9111303 

[[4]] 
[1] 0.843854 

[[5]] 
[1] -0.7596879 

[[6]] 
[1] 0.6603167 

[[7]] 
[1] -0.5477293 

[[8]] 
[1] 0.424179 

[[9]] 
[1] -0.2921388 

[[10]] 
[1] 0.1542514 

[[11]] 
[1] -0.01327675 

[[12]] 
[1] 27.71282 

[[13]] 
[1] 31.24811 

[[14]] 
[1] 34.92214 

[[15]] 
[1] 38.72984 

[[16]] 
[1] 42.66667 

[[17]] 
[1] 46.72854 

[[18]] 
[1] 50.91169 

[[19]] 
[1] 55.21273 

[[20]] 
[1] 59.62849 

Additi最後,我對爲什麼輸出每個元素的兩個數字都被分解了一點感到好奇。通常我已經習慣了矢量輸出看起來像這樣:

[1] 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 
[20] 40 

因此,任何澄清我做錯了什麼是高度讚賞。

+1

放大@李哲源ZheyuanLi的評論:看看'integration(function(t)sqrt(t),lower = 0,upper = k)的輸出'這不僅僅是一個數字。 – G5W

+0

啊,這很有道理,我想這僅僅是一個我不理解集成輸出的例子。 –

回答

2

讓我告訴你如何縮短代碼:

Y <- numeric(20) 
Y[1:12] <- cos(3 * (1:12)) 
Y[13:20] <- sapply(13:20, function (u) integrate(sqrt, lower = 0, upper = u)$value) 
+0

啊,這非常有幫助謝謝!我知道必須有一些更簡單的方法來創建初始Y向量,而無需使用for循環。我是curiou swhat sapply呢? –

+0

'lapply'和'sapply'只是第一個參數中的項目循環。 –

0

結果:

integrate(function(t) sqrt(t), lower = 0, upper = k) 

是一個列表。

你需要[[1]]抓住每一個列表項的第一個元素插入Y向量之前:

Y <- c() 
#for (k in 1:20) { # This loop is unnecessary 
#  Y[k] <- k # as it will be overwritten 
#}     # with cos(3 * k) subsequently 
for (k in 1:20) { 
    if (Y[k] < 12) { 
     Y[k] <- cos(3 * k) 
    } else { 
     Y[k] <- integrate(function(t) sqrt(t), lower = 0, upper = k)[[1]] 
    } 
} 
+0

再次演示可以用任何語言編寫Fortran代碼。 –