Ich bin schon einige Male auf dieses Problem gestoßen und habe keine andere Lösung als die triviale (siehe unten) finden können.
Angenommen, auf einem Computer laufen 2+ Instanzen von R, weil entweder 2+ Benutzer oder 1 Benutzer mehrere Prozesse ausführen, und eine Instanz führt aus update.packages()
. Ich habe schon einige Male erlebt, dass die andere Instanz einen großen Fehler gemacht hat. Die aktualisierten Pakete ändern die Funktionalität nicht in einer Weise, die die Berechnungen beeinflusst, aber irgendwie entsteht ein großes Problem.
Die triviale Lösung (Lösung 0) besteht darin, alle Instanzen von R zu beenden, während update.packages()
ausführt. Dies hat 2+ Probleme. Erstens muss man die R-Instanzen beenden. Zweitens kann man möglicherweise nicht einmal feststellen, wo diese Instanzen ausgeführt werden (siehe Update 1).
Unter der Annahme, dass sich das Verhalten des ausgeführten Codes nicht ändert (z. B. sind Paketaktualisierungen nur von Vorteil - sie beheben nur Fehler, verbessern die Geschwindigkeit, verringern den Arbeitsspeicher und gewähren Einhörner), gibt es eine Möglichkeit, eine neue Version des Pakets im laufenden Betrieb mit weniger Auswirkungen auf andere Prozesse auszutauschen?
Ich habe zwei weitere Lösungsvorschläge, die nicht von R stammen:
Lösung 1 besteht darin, einen temporären Bibliothekspfad zu verwenden, dann die alte Bibliothek zu löschen und die neue an ihre Stelle zu setzen. Der Nachteil dabei ist, dass das Löschen und Verschieben einige Zeit in Anspruch nehmen kann, in der nichts verfügbar ist.
Lösung 2 ist die Verwendung von Symlinks, die auf eine Bibliothek (oder eine Bibliothekshierarchie) verweisen, und das einfache Überschreiben eines Symlinks mit einem Zeiger auf eine neue Bibliothek, in der sich das aktualisierte Paket befindet. Dies scheint sogar weniger Ausfallzeiten für Pakete zu verursachen - die Zeit, die das Betriebssystem benötigt, um einen Symlink zu überschreiben. Der Nachteil dabei ist, dass es viel mehr Sorgfalt bei der Verwaltung von Symlinks erfordert und plattformspezifisch ist.
Ich vermute, dass die Lösung Nr. 1 durch geschickte Verwendung der folgenden Elemente so geändert werden könnte, dass sie der Lösung Nr. 2 entspricht .libPaths()
aber es scheint so, als müsste man no aufrufen update.packages()
und stattdessen einen neuen Updater schreiben, der die veralteten Pakete findet, sie in einer temporären Bibliothek installiert und dann die Bibliothekspfade aktualisiert. Der Vorteil davon ist, dass man einen existierenden Prozess auf den .libPaths()
die sie beim Start hatte (d.h. eine Änderung der Bibliothekspfade, die R kennt, wird möglicherweise nicht an die Instanzen weitergegeben, die bereits laufen, ohne dass ein expliziter Eingriff innerhalb dieser Instanz erfolgt).
Aktualisierung 1. In dem Beispielszenario befinden sich die beiden konkurrierenden R-Instanzen auf demselben Rechner. Das ist keine Voraussetzung: Soweit ich die Updates verstehe, kann das Update auch dann Probleme verursachen, wenn die beiden dieselben Bibliotheken nutzen, d. h. dieselben Verzeichnisse auf einem gemeinsamen Laufwerk, selbst wenn sich die andere R-Instanz auf einem anderen Rechner befindet. Man könnte also versehentlich einen R-Prozess beenden und es gar nicht merken.