4 votes

Passage d'éléments vectoriels à l'appel comme arguments consécutifs

Fonction et vecteur de test donnés :

multiply_stuff <- function(...) {
    arguments <- list(...)
    Reduce(f = `*`, x = arguments)
}

test_vec <- c(1, 20, 3, 40, 5, 60)

Je voudrais créer un call liste automatiquement tous les arguments du vecteur passé. Dans cet exemple, ce serait l'équivalent de l'expression :

call("multiply_stuff",
     test_vec[1],
     test_vec[2],
     test_vec[3],
     test_vec[4],
     test_vec[5],
     test_vec[6])

Tentatives

Par exemple pour le vecteur :

test_vec_B <- c(1, 5, 6, 8, 9, 11, 12, 14, 20, 11)

J'aimerais répertorier automatiquement tous les test_vec_B arguments au sein de call("multiply_stuff",...) . Naturellement, cela ne fonctionnera pas :

call("multiply_stuff", test_vec_B)
call("multiply_stuff", list(test_vec_B))

Résultats souhaités

Expression non évaluée équivalente à :

call(
    "multiply_stuff",
    test_vec_B[1],
    test_vec_B[2],
    test_vec_B[3],
    test_vec_B[4],
    test_vec_B[5],
    test_vec_B[6],
    test_vec_B[7],
    test_vec_B[8],
    test_vec_B[9],
    test_vec_B[10]
)

2voto

pieca Points 1652

Vous pouvez créer un call puis lui ajouter des arguments :

multiply_stuff <- function(...) {
  arguments <- list(...)
  Reduce(f = `*`, x = arguments)
}
test_vec_B <- c(1, 5, 6, 8, 9, 11, 12, 14, 20, 11)

get_call <- function(f, arg_vector){
  my_call <- call(f)
  my_call[2:(length(arg_vector) + 1)] <- arg_vector
  return(my_call)
}

multiply_stuff(1, 5, 6, 8, 9, 11, 12, 14, 20, 11)
[1] 878169600

test_call <- get_call("multiply_stuff", test_vec_B)
eval(test_call)
[1] 878169600

Explication : lorsque vous créez un call vous pouvez accéder/modifier la fonction et ses arguments par index comme d'habitude. L'indice 1 correspond à l'appel de la fonction, les indices à partir de 2 sont les arguments.Exécuter pour vérifier :

test_call2 <- call("sum", 1, 2)
test_call2[1]
test_call2[2]
test_call2[3]
eval(test_call2)

test_call2[3] <- 1234
eval(test_call2)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X