Angenommen, ich habe zwei Listen mit Namen,
%Vor%Ich möchte diese Listen rekursiv zusammenführen und Einträge überschreiben, wenn das zweite Argument widersprüchliche Werte enthält. I.e. die erwartete Ausgabe wäre
%Vor%Irgendein Hinweis?
Ich denke, dass Sie hier Ihre eigene rekursive Funktion schreiben müssen.
Eine Funktion, die zwei Listen akzeptiert, list1
und list2
.
Wenn:
list1[[name]]
existiert, aber nicht list2[[name]]
, verwenden Sie list1[[name]]
; list1[[name]]
existiert ebenso wie list2[[name]]
und beide sind keine Listen, verwenden Sie list2[[name]]
; list1[[name]]
und list2[[name]]
als neue Listen. Etwas wie:
%Vor%Vorbehalte - Wenn Ihre Listen verschmolzen sind, können Sie seltsame Ergebnisse erzielen. Zum Beispiel:
%Vor% Dann hat Ihre zusammengeführte Liste a=2, b=3
. Dies liegt daran, dass der Wert von b$a
den Wert von a$a
überschreibt, obwohl a$a
eine Liste ist (Sie haben nicht angegeben, was passieren würde, wenn dies der Fall wäre). Es ist jedoch einfach genug, myMerge
zu modifizieren, um diese Art von Fällen zu behandeln. Erinnern Sie sich einfach - verwenden Sie is.list
, um zu testen, ob es eine Liste ist, und is.null(myList$a)
, um zu sehen, ob der Eintrag a
in der Liste myList
existiert.
Hier ist die "vektorisierte" Version mit sapply
:
Ich bin mir nicht sicher, ob hier eine benutzerdefinierte Funktion notwendig ist. Es gibt eine Funktion utils::modifyList()
, um genau diese Operation auszuführen! Weitere Informationen finden Sie modifyList .
Welche gibt das folgende
%Vor%