警告消息将值重新分配给R中的积分?

时间:2017-01-14 18:11:12

标签: r

我对R很新,但我只是想对向量Y中的元素进行简单的条件重新分配。但是,当重新分配处理积分时,我会不断收到警告消息。这是完整的代码:

> 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

此外,我有点好奇为什么输出被分解为每个元素的两个数字。通常我习惯于向量输出看起来像这样:

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

所以对我做错的任何澄清都非常感谢。

2 个答案:

答案 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 )

答案 1 :(得分: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]]
     }
}