我想用R编写一个函数f(m,r),其中m,r是整数,这样m> r> = 1且f返回d_j的向量。我是R的初学者,我想我可能需要在函数体中循环。但是如何准确地写呢?预先感谢。
图片显示d_j的值,j的范围是0到m-2。
答案 0 :(得分:1)
在步骤2中,您将为dj指定一个新值。我不认为为什么以及如何将步骤1设为步骤2的必要先决条件。
下面是两个不同的函数,f1()和f2()。想法是将“ for 0 <= j <= r-1”重新编码为可以迭代的范围:
f1 <- function(m, r) {
if (m <= r) {stop('m <= r')}
if (r <= 1) {stop('r <= 1')}
d <- c()
for (j in 0 : r - 1) {d <- c(d, (m - r) * (j + 1))}
return(d)
}
f2 <- function(m, r){
if (m <= r) {stop('m <= r')}
if (r <= 1) {stop('r <= 1')}
d <- c()
for (j in r : m - 1) {d <- c(d, r*(m - j - 1))}
return(d)
}
f1(12, 4)
#[1] 0 8 16 24 32
f2(12, 4)
#[1] 32 28 24 20 16 12 8 4 0
答案 1 :(得分:0)
您要应用的操作对于不同的输入不相互依赖;也就是说,计算d_1不会影响d_2,d_3等,也不会受到d_2,d_3等的影响。通常,在这种情况下,可以使用R的向量化运算(或apply
函数家族之一)来避免正式编写for
循环。
在下面的函数定义中,我编写了向量0:(r-1)
和r:(m-1)
作为j
值的向量,以输入到每个公式。
d_j <- function(m,r) {
a1 <- (m-r) * ((0:(r-1)) + 1)
a2 <- r * (m - 1 - (r:(m-1)))
return(c(a1,a2))
}
让我们测试一个简单的案例。对于m=3
,r=1
,我们应该从第一个公式返回2
,从第二个公式返回c(1,0)
:
> d_j(3,1)
[1] 2 1 0
对于更大的情况,我们有
> d_j(12,4)
[1] 8 16 24 32 28 24 20 16 12 8 4 0