dot-dot-dot参数无法按预期工作

时间:2017-08-08 11:17:50

标签: r function arguments

我使用以下函数根据一些均衡/相关矩阵Sigma创建一堆正态分布的数据。

fun <- function(.sample_size, .Sigma, .ndraws = 1, ...) {
  replicate(.ndraws,
            scale(MASS::mvrnorm(.sample_size, mu = rep(0, ncol(.Sigma)), Sigma = .Sigma)),
            simplify = FALSE)
}

Sigma <- matrix(c(1, 0.3, 0.3, 1), nrow = 2)

函数mvrnorm有一个额外的参数empirical,可以设置为TRUEFALSE。我在我的函数...中添加了fun agrument,以便在我使用empirical = T时根据需要将参数mvrnorm传递给fun函数。所以我做了:

dat <- fun(.sample_size = 100, .Sigma = Sigma, empirical =TRUE)

lapply(dat, cor)
#> [[1]]
#>           [,1]      [,2]
#> [1,] 1.0000000 0.3164037
#> [2,] 0.3164037 1.0000000

但这似乎不起作用,因为empirical = T会更改生成的数据,以便可以恢复原始的Sigma矩阵。

如果我执行我的函数体,这项工作:

dd <- replicate(1, scale(MASS::mvrnorm(100, mu = rep(0, 2), Sigma = Sigma, empirical = TRUE)), simplify = FALSE)

lapply(dd, cor)
#> [[1]]
#>      [,1] [,2]
#> [1,]  1.0  0.3
#> [2,]  0.3  1.0

问题:我做错了什么?

1 个答案:

答案 0 :(得分:2)

您需要将省略号传递给函数内的函数调用。否则,传递给它的参数将被忽略(有时需要)。

但是,我认为这仍然无法正常工作,因为replicate似乎不支持传递省略号。原因可能是它处理的是表达式而不是函数。我建议您直接使用lapply

fun <- function(.sample_size, .Sigma, .ndraws = 1, ...) {
  lapply(seq_len(.ndraws),
            function(.sample_size, .Sigma, .ndraws, ...) 
              scale(MASS::mvrnorm(.sample_size, mu = rep(0, ncol(.Sigma)), Sigma = .Sigma, ...)),
         .sample_size = .sample_size, .Sigma = .Sigma, .ndraws = .ndraws, ...)
}

Sigma <- matrix(c(1, 0.3, 0.3, 1), nrow = 2)

set.seed(42)
dat <- fun(.sample_size = 100, .Sigma = Sigma, empirical = FALSE)
dat[[1]][1:3,]
#           [,1]       [,2]
#[1,]  0.3228743  1.8240016
#[2,] -1.1732884  0.1865766
#[3,]  0.8237171 -0.2726090

set.seed(42)
dat <- fun(.sample_size = 100, .Sigma = Sigma, empirical = TRUE)
dat[[1]][1:3,]
#           [,1]       [,2]
#[1,] -0.3919629 -1.8811836
#[2,]  1.1444412 -0.4162717
#[3,] -0.7976478  0.4429600