Функция зацикливания с тремя аргументами, циклы mapply / sapply / for не работают? - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь перебрать функцию, которая имеет три аргумента, но ни 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

Ответы [ 3 ]

4 голосов
/ 07 марта 2019

Вы можете попробовать:

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
...
2 голосов
/ 07 марта 2019

Решение на основе мурлыкания / 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))
0 голосов
/ 07 марта 2019
# 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)
...