如何通过循环创建一个新向量

how to create a new vector via loop

a) 创建一个长度为 20 的向量 X,X 中的第 k 个元素 = 2k,k=1…20。打印出 X 的值。

b) 创建一个长度为20的向量Y,Y中的所有元素都等于0。打印出Y的值。

c) 使用 for 循环,重新分配 Y 中第 k 个元素的值,因为 k = 1…20。当 k < 12 时,Y 的第 k 个元素被重新分配为 k 的余弦。当k≥12时,将Y的第k个元素重新赋值为整数sqrt(t)dt从0到K的值。

前两个问题,很简单。

 > x1 <- seq(1,20,by=2) 
 > x <- 2 * x1 
 > x
  [1]  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
 > y <- rep(0,20)
 > y
  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  

我卡在最后一个了,

 t <- function(i) sqrt(i)
 for (i in 1:20) {
   if (i < 12) {
  y[i] <- cos(i)
  }
   else if (i >= 12) {
   y[i] <- integral(t, lower= 0, Upper = 20)
  }
  }
  y // print new y 

有什么建议吗?谢谢。

可能有用的是,计算一维积分的命令是 integrate 而不是 integral

您已成功完成前两个,所以我将演示获取这些向量的不同方法:

x <- 2 * seq_len(20)
y <- double(length = 20)

至于你的函数,你的想法是正确的,但你需要稍微清理一下你的语法。例如,您可能需要仔细检查大括号(使用像 Hadley Wickham's 这样的集合样式将帮助您防止语法错误并使代码更具可读性),您不需要 else 中的“if”,您需要阅读 integrate 并了解它的输入,重要的是它的 输出 是什么(以及您需要哪些以及如何提取它),最后,您需要 return 函数中的值。希望这足以帮助您自己解决问题。祝你好运!

更新

演示编码风格和一些循环最佳实践的函数略有不同

鉴于已发布有效答案,这就是我在查看您的问题时所做的。我认为值得发布,因为我认为这是一个好习惯 1) 预先分配答案 2) 通过不重新使用输入变量名称作为输出来防止范围混淆 3) 使用 seq_len 和 seq_along for 循环的构造,根据 R Inferno(pdf),我认为需要阅读:

tf <- function(y){
  z <- double(length = length(y))
  for (k in seq_along(y)) {
    if (k < 12) {
      z[k] <- cos(k)
    } else {
      z[k] <- integrate(f = sqrt, lower = 0, upper = k)$value
    }
  }
  return(z)
}

哪个returns:

> tf(y)
 [1]  0.540302306 -0.416146837 -0.989992497 -0.653643621  0.283662185  0.960170287  0.753902254 
 [8] -0.145500034 -0.911130262 -0.839071529  0.004425698 27.712816032 31.248114562 34.922139530
[15] 38.729837810 42.666671456 46.728535669 50.911693960 55.212726149 59.628486093

老实说,你几乎已经准备好了,很高兴你在这里展示了一些代码:

y <- rep(0,20) #y vector from question 2

for ( k in 1:20) {              #start the loop
  if (k < 12) {                 #if k less than 12
    y[k] <- cos(k)              #calculate cosine
  } else if( k >= 12) {         #else if k greater or equal to 12
    y[k] <- integrate( sqrt, lower=0, upper=k)$value #see below for explanation
}
}
print(y) #prints y

> print(y)
 [1]  0.540302306 -0.416146837 -0.989992497 -0.653643621  0.283662185  0.960170287  0.753902254 -0.145500034 -0.911130262 -0.839071529  0.004425698
[12] 27.712816032 31.248114562 34.922139530 38.729837810 42.666671456 46.728535669 50.911693960 55.212726149 59.628486093

首先stats::integrate是你需要计算积分的函数

 integrate( sqrt, lower=0, upper=2)$value

第一个参数是一个函数,在您的例子中是 sqrtsqrt 已在 R 中定义,因此无需自己明确定义为 t <- function(i) sqrt(i)

您在代码中正确设置的其他两个参数是 lowerupper

函数integrate( sqrt, lower=0, upper=2)将return:

1.885618 with absolute error < 0.00022

这就是为什么您需要 integrate( sqrt, lower=0, upper=2)$value 来仅提取值。

在您的控制台中键入 ?integrate 以查看我认为会对您有很大帮助的文档。