我试图遍历具有三个参数的函数,但是lapply
和mapply
都没有提供正确的解决方案。这里的目标是基于三个参数(num
,resp
,cdr
)的所有可能组合来获得所有可能的结果。如果您看到下面的函数,则此处的目标是针对所有三个n
级别的num(保持resp
和cdr
的所有三个级别)计算resp
(保持num
和cdr
不变),以及对于cdr
的所有三个级别(保持resp
和num
不变)。但是,从输出中可以看到,lapply
和mapply
都没有在这里提供正确的答案。
试图用嵌套for
循环来完成此操作也没有成功(尽管我在使用循环方面不是很出色,因此如果我能找到正确的答案,我愿意接受基于循环的解决方案)
最小可重复的示例:
set.seed(124)
num <- c(10, 20, 30)
resp <- sample(100:200, 3)
cdr <- 3:5
my_fun <- function(num, resp, cdr){
n <- ((num * resp) / cdr)
}
sapply(num, my_fun, resp, cdr)
[,1] [,2] [,3]
[1,] 360 720 1080
[2,] 350 700 1050
[3,] 302 604 906
mapply(my_fun, num, resp, cdr)
[1] 360 700 906
答案 0 :(得分:4)
您可以尝试:
df <- expand.grid(data.frame(num, resp, cdr))
with(df, (num * resp) / cdr)
num resp cdr n
1 10 151 3 503.3333
2 20 151 3 1006.6667
3 30 151 3 1510.0000
4 10 176 3 586.6667
5 20 176 3 1173.3333
...
答案 1 :(得分:2)
基于purrr / dplyr的解决方案是:
set.seed(124)
num <- c(10, 20, 30)
resp <- sample(100:200, 3)
cdr <- 3:5
my_fun <- function(num, resp, cdr){
((num * resp) / cdr)
}
args <- list(num = num, resp = resp, cdr = cdr)
args %>%
purrr::cross_df() %>%
dplyr::mutate(res = my_fun(num, resp, cdr))
答案 2 :(得分:0)
# gen data
set.seed(124)
num <- c(10, 20, 30)
resp <- sample(100:200, 3)
cdr <- 3:5
# function (written with one input vector)
my_fun <- function(x){
x[1] * x[2] / x[3]
}
# used expand.grid() and apply() to
# eval function on all combos of num, resp, cdr
opts <- expand.grid(num, resp, cdr)
res <- apply(opts, 1, my_fun)
cbind(opts, res)