如何通过循环创建一个新向量
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
第一个参数是一个函数,在您的例子中是 sqrt
。 sqrt
已在 R 中定义,因此无需自己明确定义为 t <- function(i) sqrt(i)
您在代码中正确设置的其他两个参数是 lower
和 upper
。
函数integrate( sqrt, lower=0, upper=2)
将return:
1.885618 with absolute error < 0.00022
这就是为什么您需要 integrate( sqrt, lower=0, upper=2)$value
来仅提取值。
在您的控制台中键入 ?integrate
以查看我认为会对您有很大帮助的文档。
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
第一个参数是一个函数,在您的例子中是 sqrt
。 sqrt
已在 R 中定义,因此无需自己明确定义为 t <- function(i) sqrt(i)
您在代码中正确设置的其他两个参数是 lower
和 upper
。
函数integrate( sqrt, lower=0, upper=2)
将return:
1.885618 with absolute error < 0.00022
这就是为什么您需要 integrate( sqrt, lower=0, upper=2)$value
来仅提取值。
在您的控制台中键入 ?integrate
以查看我认为会对您有很大帮助的文档。