Oui, vous pouvez l'obtenir en utilisant ceci:
> lapply(list(a=10,b=10,c=10), function(x)substitute(x)[[3]])
Résultat:
$a
[1] 1
$b
[1] 2
$c
[1] 3
Explication: lapply
crée des appels de la forme FUN(X[[1L]], ...)
, FUN(X[[2L]], ...)
etc. Donc, l'argument qu'il passe est - X[[i]]
où i
est l'index courant dans la boucle. Si nous obtenons ce avant c'est évaluée (c'est à dire, si nous utilisons substitute
), nous obtenons le non évaluée expression X[[i]]
. C'est un appel à l' [[
de la fonction, avec des arguments X
(un symbole) et i
(un entier). Donc, substitute(x)[[3]]
renvoie précisément cet entier.
Ayant l'index, vous pouvez accéder aux noms trivialement, si vous tout d'abord l'enregistrer comme ceci:
L <- list(a=10,b=10,c=10)
n <- names(L)
lapply(L, function(x)n[substitute(x)[[3]]])
Résultat:
$a
[1] "a"
$b
[1] "b"
$c
[1] "c"
Ou à l'aide de cette deuxième astuce: :-)
lapply(list(a=10,b=10,c=10), function(x)names(eval(sys.call(1)[[2]]))[substitute(x)[[3]]])
(le résultat est le même).
Explication 2: sys.call(1)
retours lapply(...)
, de sorte qu' sys.call(1)[[2]]
est l'expression utilisée comme liste d'argument lapply
. En la passant à l' eval
crée un légitime objet names
peut accéder. Délicat, mais il fonctionne.
Bonus: une deuxième façon d'obtenir les noms de:
lapply(list(a=10,b=10,c=10), function(x)eval.parent(quote(names(X)))[substitute(x)[[3]]])
Notez que X
est un objet valide dans le cadre parent d' FUN
, et les références de la liste argument de l' lapply
, de sorte que nous pouvons obtenir avec eval.parent
.