R: przekazywanie ramki danych przez odniesienie

R ma semantykę pass-by-value, która minimalizuje przypadkowe skutki uboczne (dobra rzecz). Jednak, gdy kod jest zorganizowany w wiele funkcji / metod wielokrotnego użytku / czytelności/konserwacji i gdy kod ten musi manipulować dużymi strukturami danych poprzez np. duże ramki danych, poprzez serię przekształceń / operacji semantyka pass-by-value prowadzi do wielu kopiowania danych wokół i dużo tłuczenie kupy (zła rzecz). Na przykład ramka danych, która zajmuje 50Mb na sterta przekazywana jako parametr funkcji będzie kopiowana co najmniej tyle samo razy co głębokość wywołania funkcji, a rozmiar sterty na dole stosu będzie wynosił n*50MB. Jeśli funkcje zwracają przekształconą / zmodyfikowaną ramkę danych z głębi łańcucha wywołania, kopiowanie wzrasta o kolejne N.

Pytanie SO Jaki jest najlepszy sposób na uniknięcie przekazywania ramki danych? dotyka tego tematu, ale jest sformułowany w sposób, który pozwala uniknąć bezpośredniego pytania pytanie pass-by-reference i zwycięska odpowiedź w zasadzie mówi: "tak, pass-by-value to jak działa R". To nie jest w 100% dokładne. Środowiska R umożliwiają semantykę pass-by-reference, a frameworki oo, takie jak proto , wykorzystują tę funkcję szeroko. Na przykład, gdy obiekt proto jest przekazywany jako argument funkcji, podczas gdy jego "magiczna owijka" jest przekazywana przez wartość, programiście R semantyka jest przekazywana przez odniesienie.

Wydaje się, że przekazywanie dużych ramek danych przez odniesienie byłby to częsty problem i zastanawiam się, jak inni podeszli do niego i czy są jakieś biblioteki, które to umożliwiają. W moich poszukiwaniach nie znalazłem żadnego.

Jeśli nic nie jest dostępne, moim podejściem byłoby stworzenie obiektu proto, który owija ramkę danych. Byłbym wdzięczny za wskazówki o cukrze składniowym, który powinien być dodany do tego obiektu, aby był użyteczny, np. przeciążenie operatorów $ i [[, a także wszelkich gotchów, na które powinienem zwrócić uwagę. Nie jestem R ekspert.

Punkty Bonusowe za rozwiązanie typu agnostycznego pass-by-reference, które ładnie integruje się z R, chociaż moje potrzeby dotyczą wyłącznie ramek danych.

Author: Community, 2012-06-26

1 answers

Przesłanka pytania jest (częściowo) błędna. R działa jako pass-by-promise i jest powtarzane kopiowanie w sposób, który zarysujesz tylko wtedy, gdy kolejne przydziały i zmiany w ramce danych są dokonywane w miarę przekazywania obietnicy. Więc liczba kopii nie będzie N * Rozmiar gdzie N jest głębokość stosu, ale raczej gdzie N jest liczba poziomów, na których wykonywane są zadania. Masz jednak rację, że środowiska mogą być przydatne. Widzę po linku, który już znalazłeś pakiet "proto". Istnieje również stosunkowo niedawne wprowadzenie "klasy referencyjnej" czasami określanej jako "R5", gdzie R / S3 był oryginalnym systemem klasowym S3, który jest kopiowany w R i R4 byłby nowszym systemem klasowym, który wydaje się głównie wspierać rozwój pakietu BioConductor.

Oto link do przykładu Steve ' a Lianoglou (w wątku omawiającym zalety klas referencyjnych) osadzania środowiska wewnątrz obiektu S4 w celu uniknięcia kopiowania koszty:

Https://stat.ethz.ch/pipermail/r-help/2011-September/289987.html

Dane Matthew Dowle ' a.pakiet table ' tworzy nową klasę obiektu danych, której semantyka dostępu za pomocą "[" jest inna niż w przypadku zwykłych danych R.ramki, a to naprawdę działa jako pass-by-reference. Ma doskonałą szybkość dostępu i przetwarzania. Może również wrócić do semantyki dataframe, ponieważ w późniejszych latach takie obiekty dziedziczą teraz ' dane.Klasa frame ' a.

Możesz chcesz również zbadać pakiet danych Hesterberga .

 27
Author: 42-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-26 13:32:39