R:编写一个返回向量的两阶段函数

时间:2018-10-27 23:50:21

标签: r function

values of d_j's. j ranges from 0 to m-2

我想用R编写一个函数f(m,r),其中m,r是整数,这样m> r> = 1且f返回d_j的向量。我是R的初学者,我想我可能需要在函数体中循环。但是如何准确地写呢?预先感谢。

图片显示d_j的值,j的范围是0到m-2。

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=3r=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