pmap 的三个输入,但只迭代其中两个

Three inputs to pmap but only iterate over two of them

我有这个功能:

power_fcn <- function(.x, .y, .l){
  tmp <- pwr.t.test(n = .x, 
                    d = NULL, 
                    power = 0.8, 
                    sig.level = .y,
                    type = .l, 
                    alternative = "two.sided")

  tibble(n_per_arm = .x, 
         power = tmp$power, 
         sig_level = tmp$sig.level, 
         test = tmp$alternative,
         type = tmp$type, 
         cohens_d = tmp$d)
}

我希望能够 运行 这两次,并在每次调用时更改 type。例如,第一个调用是 type = "two.sample" 并且看起来像这样:

d1 <- crossing(n = seq(100, 500, by = 100),
               alpha = c(0.05, 0.005))

power_df <- purrr::pmap_dfr(
  .x = d1$n,
  .y = d1$alpha,
  .l = "two.sample", #this is the bit i want to be able to vary on each call
  .f = power_fcn
)

但是,R 试图遍历 .l 以及 .x.y。我不希望它那样做。我可以在 crossing() 中包含 type 但这意味着我只能 运行 调用一次 power_fcn 并且它将同时包含 "two.sample""paired",例如。如果我希望能够 运行 多次,例如:

power_df_twosample <- purrr::pmap_dfr(
 .x = d1$n,
 .y = d1$alpha,
 .l = "two.sample",
 .f = power_fcn
)

power_df_paired <- purrr::pmap_dfr(
 .x = d1$n,
 .y = d1$alpha,
 .l = "paired",
 .f = power_fcn
)

我需要找到一种方法让 R 不遍历 .l,或者找到另一种方法将动态对象传递给 power_fcn(对于 typemap2_dfr.

有人可以帮忙吗?

我猜这个有用。 pmap 中的 .l 应该是向量列表(或数据框),并且您的函数会迭代它们。其他参数,如 type(或原始代码中的 .x 和 .y)也被传递,我认为它们不需要是向量,也不需要被迭代。

power_fcn <- function(n, alpha, type) {
  tmp <- pwr.t.test(n = n, 
                    d = NULL, 
                    power = 0.8, 
                    sig.level = alpha,
                    type = type, 
                    alternative = "two.sided")

  tibble(n_per_arm = n, 
         power = tmp$power, 
         sig_level = tmp$sig.level, 
         test = tmp$alternative,
         type = tmp$type, 
         cohens_d = tmp$d)
}

d1 <- crossing(n = seq(100, 500, by = 100),
               alpha = c(0.05, 0.005))

power_df <-
  pmap_dfr(.l = d1, .f = power_fcn, type = "two.sample")

##> # A tibble: 10 × 5
##>    n_per_arm power sig_level test      cohens_d
##>        <dbl> <dbl>     <dbl> <chr>        <dbl>
##>  1       100   0.8     0.005 two.sided    0.521
##>  2       100   0.8     0.05  two.sided    0.398
##>  3       200   0.8     0.005 two.sided    0.367
##>  4       200   0.8     0.05  two.sided    0.281
##>  5       300   0.8     0.005 two.sided    0.299
##>  6       300   0.8     0.05  two.sided    0.229
##>  7       400   0.8     0.005 two.sided    0.259
##>  8       400   0.8     0.05  two.sided    0.198
##>  9       500   0.8     0.005 two.sided    0.231
##> 10       500   0.8     0.05  two.sided    0.177