2013-07-24 10 views
25

Gibt es eine Möglichkeit, Mapply auf zwei Vektoren zu verwenden, um eine benannte Liste zu erstellen? Der erste Vektor würde vom Typ character sein und die für die Liste verwendeten Namen enthalten, während der zweite die Werte enthält.Erstellen einer benannten Liste aus zwei Vektoren (Namen, Werte)

Bisher ist die einzige Lösung, die ich habe ist:

> dummyList = list() 
> addToList <- function(name, value) { 
+ dummyList[[name]] <- value 
+ } 
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2)) 
$foo 
`1` 

$bar 
`2` 

Dies scheint eine ziemlich gekünstelt Lösung, aber ich kann nicht herausfinden, wie es sonst zu tun. Die Probleme, die ich mit ihm haben, sind:

  1. sie die Schaffung von dummyList erfordert, obwohl dummyList nie geändert wird und eine leere Liste nach dem Aufruf von mapply.

  2. Wenn der numerische Vektor nicht in eine Liste konvertiert wird, ist das Ergebnis des Aufrufs an mapply ein benannter Vektor von Doubles.

Um das zu umgehen Problem 2, kann ich immer anrufen nur mapply auf zwei Vektoren und dann as.list auf dem Ergebnis nennen, aber es scheint, als ob es eine Möglichkeit sein sollte, um eine Liste mit den Werten in einem direkt zu erstellen sein Vektor.

Antwort

46

Sie setNames()

setNames(as.list(c(1,2)), c("foo", "bar")) 

verwenden können (Liste) oder

setNames(c(1,2), c("foo", "bar")) 

(für einen Vektor)

+2

Vielen Dank. Ich war mir der 'setNames'-Funktion nicht bewusst und das passt perfekt zu meinen Zielen. Aus Neugier, gibt es einen Weg, es zu tun, mit "Lapply", die Sie kennen? Es scheint möglich, dass 'lapply' Listen zurückgeben kann. –

+0

was meinst du mit "benutzen' lapply' "? Möchten Sie die gleiche Aufgabe mit 'lapply' ausführen? (Wenn ja, warum? Als Programmierübung? Mehr Kontext wäre nützlich.) Wenn Sie etwas anderes machen wollen, bearbeiten Sie Ihre Frage oder fragen Sie eine neue? –

8

ich Bens Verwirrung teilen, warum Sie dies tun wollen könnte, und seine Empfehlung.

nur um ihrer selbst willen Neugier, gibt es eine Art von "hidden" Feature in mapply, die dies ermöglicht:

x <- letters[1:2] 
y <- 1:2 
mapply(function(x,y) { y }, x, y, SIMPLIFY = FALSE,USE.NAMES = TRUE) 
$a 
[1] 1 

$b 
[1] 2 

Anbetracht dessen, dass die Dokumentation für USE.NAMES sagt:

USE.NAMES logische ; Verwenden Sie Namen, wenn das erste ... Argument Namen hat, oder wenn es ein Zeichenvektor ist, verwenden Sie diesen Zeichenvektor als Namen.

+1

Ich denke nicht, dass dies ein so rätselhafter Anwendungsfall ist, nur ein degenerierter. Ich musste zwei Doppelarrays mit jeder Art von row.names Spalte kombinieren, die nicht automatisch von USE.NAMES übernommen wurde, also musste ich row.names (x) manuell als Argument an die Funktion übergeben, die nicht funktioniert Verwende nicht: 'f = Funktion (n, x, y) {if (y> 0) {-1 * x} else {x}}; r = Mapply (f, Zeile.Name (x), x, y, SIMPLIFY = F, USE.NAMES = T) '. Ein 'dat.frame (unlist (r))' beendete den Job. Danke, dass du auf diese Funktion hingewiesen hast! –