函数的可变输入数量 - R.

时间:2016-12-01 12:38:18

标签: r

我有以下函数AB表示向量作为输入。我的问题是如何为这个功能提供不同数量的vector。在我的函数中,n是固定的并显示样本数。例如,我需要我的函数也适用于这种情况:sample_sum (A, B, C, D, E, n, ...)。 另外对于我得到矢量A和B的样本的部分(即在行sample_A <- qss(A, n=n, ...)中)我如何修改它以适应不使用for循环的不同数量的矢量,因为for循环不是足够快。

谢谢

sample_sum <- function(A, B, n, ...)
{
  qss <- function(X, n, ...)
  {
    r_X <- range(X)
    dens_X <- density(X, ...)
    sample(dens_X$x, size=n, prob=dens_X$y, replace=TRUE)
  }
sample_A <- qss(A, n=n, ...)
sample_B <- qss(B, n=n, ...)
sample_A + sample_B
}

2 个答案:

答案 0 :(得分:1)

我认为您需要的是以下内容:

new_sample_sum <- function(my_vector_list, n, ...)
{
  qss <- function(X, n, ...)
  {
    r_X <- range(X)
    dens_X <- density(X, ...)
    sample(dens_X$x, size=n, prob=dens_X$y, replace=TRUE)
  }

  rowSums(sapply(my_vector_list, qss, n = n))

}

您可以在矢量列表中放置多个矢量,然后在列表上进行计算,而不必担心矢量的数量。只是关于计算的简短说明,sapply将循环遍历列表中的所有向量,然后返回,其中包含将qss应用于每个向量的所有结果(对于每个向量,结果是一列中的sapply返回的表)。由于您在函数的最后一步中添加了向量,因此我会在表格的rowSums中显示所有结果。

为了证明一致性:

set.seed(1)
x <- c(1,2,3,4)
y <- c(6,7,9,0)
z <- c(2,2,2,2)

> sample_sum(x, y, n=2)
[1]  6.545129 13.474390

> new_sample_sum(list(x, y), n = 2)
[1]  6.545129 13.474390

或者有更多载体:

sample_sum <- function(A, B, C, n, ...)
{
  qss <- function(X, n, ...)
  {
    r_X <- range(X)
    dens_X <- density(X, ...)
    sample(dens_X$x, size=n, prob=dens_X$y, replace=TRUE)
  }
  sample_A <- qss(A, n=n, ...)
  sample_B <- qss(B, n=n, ...)
  sample_C <- qss(C, n=n, ...)
  sample_A + sample_B + sample_C
}

set.seed(1)
> sample_sum(x, y, z, n = 2)
[1]  6.102482 15.450364
set.seed(1)
> new_sample_sum(list(x, y, z), n = 2)
[1]  6.102482 15.450364

答案 1 :(得分:0)

只需使用n=length(A)动态确定矢量参数的大小。