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

时间:2015-01-14 22:17:05

标签: r

a)创建一个长度为20的向量X,其中第k个元素为X = 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个元素被重新分配为0到K之间的积分sqrt(t)dt的值。

前两个问题,很简单。

 > 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 

有什么建议吗?谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

更新

使用循环

来演示编码风格和一些最佳实践的功能略有不同

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

return

返回:

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)
}

答案 1 :(得分:1)

说实话,你几乎已经准备好了,你在这里展示了一些代码是好的:

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)将返回:

1.885618 with absolute error < 0.00022

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

在控制台中输入?integrate以查看对我来说有用的文档。