Il y a une excellente réponse sur le site Blog Struggling Through Problems
Ceci est tiré de là, avec des modifications très mineures.
EN UTILISANT LES TROIS FONCTIONS SUIVANTES (Plus une pour permettre des listes de tailles différentes)
# Generic form
'%=%' = function(l, r, ...) UseMethod('%=%')
# Binary Operator
'%=%.lbunch' = function(l, r, ...) {
Envir = as.environment(-1)
if (length(r) > length(l))
warning("RHS has more args than LHS. Only first", length(l), "used.")
if (length(l) > length(r)) {
warning("LHS has more args than RHS. RHS will be repeated.")
r <- extendToMatch(r, l)
}
for (II in 1:length(l)) {
do.call('<-', list(l[[II]], r[[II]]), envir=Envir)
}
}
# Used if LHS is larger than RHS
extendToMatch <- function(source, destin) {
s <- length(source)
d <- length(destin)
# Assume that destin is a length when it is a single number and source is not
if(d==1 && s>1 && !is.null(as.numeric(destin)))
d <- destin
dif <- d - s
if (dif > 0) {
source <- rep(source, ceiling(d/s))[1:d]
}
return (source)
}
# Grouping the left hand side
g = function(...) {
List = as.list(substitute(list(...)))[-1L]
class(List) = 'lbunch'
return(List)
}
Puis d'exécuter :
Regroupez le côté gauche en utilisant la nouvelle fonction g()
La partie droite doit être un vecteur ou une liste. Utilisez l'opérateur binaire nouvellement créé %=%
# Example Call; Note the use of g() AND `%=%`
# Right-hand side can be a list or vector
g(a, b, c) %=% list("hello", 123, list("apples, oranges"))
g(d, e, f) %=% 101:103
# Results:
> a
[1] "hello"
> b
[1] 123
> c
[[1]]
[1] "apples, oranges"
> d
[1] 101
> e
[1] 102
> f
[1] 103
Exemple d'utilisation de listes de tailles différentes :
Plus long côté gauche
g(x, y, z) %=% list("first", "second")
# Warning message:
# In `%=%.lbunch`(g(x, y, z), list("first", "second")) :
# LHS has more args than RHS. RHS will be repeated.
> x
[1] "first"
> y
[1] "second"
> z
[1] "first"
Plus long côté droit
g(j, k) %=% list("first", "second", "third")
# Warning message:
# In `%=%.lbunch`(g(j, k), list("first", "second", "third")) :
# RHS has more args than LHS. Only first2used.
> j
[1] "first"
> k
[1] "second"
0 votes
Vous voulez dire quelque chose comme en PHP
list($a, $b) = array(1, 2)
? Ce serait bien ! +1.0 votes
@Tomas T - Je pense que mon
vassign
La suggestion ci-dessous s'en approche... :)0 votes
Note : Les points-virgules ne sont pas nécessaires pour cette partie de R.
1 votes
Si vous essayez de le faire dans un environnement approprié, ce serait aussi simple que de
X <- list();X[c('a','b')] <- values[c(2,4)]
. D'accord, vous ne les affectez pas dans l'espace de travail, mais vous les gardez bien ensemble dans une liste. Je préfère procéder de cette façon.11 votes
J'aime python, juste a, b = 1,2. toutes les réponses ci-dessous sont 100x plus difficiles
0 votes
@appleLover Cela s'appelle "destructuring assignment" et la plupart des langages (même ceux qui ne sont pas considérés comme des "langages de script") le supportent de nos jours.
0 votes
Je pense que le PO (s'il est toujours là ?) ou le compte de la communauté devrait accepter une réponse. De cette façon, nous pouvons légitimement signaler les doublons (car il semble que cette question ait des réponses populaires et de haute qualité).