R: Przekazywanie ramki danych przez odniesienie

R ma semantykę pass-by-value, która minimalizuje przypadkowe efekty uboczne (dobra rzecz). Jednakże, gdy kod jest zorganizowany w wiele funkcji / metod do ponownego użycia / czytelności / łatwości konserwacji i gdy kod ten musi manipulować dużymi strukturami danych poprzez np. Duże ramki danych, poprzez serię transformacji / operacji, prowadzi semantyka pass-by-value dużo kopiowania danych wokół i dużo rzucania sterty (zła rzecz). Na przykład ramka danych, która zajmuje 50 MB na stercie przekazywanej jako parametr funkcji, zostanie skopiowana co najmniej tyle samo razy, co głębokość wywołania funkcji, a wielkość sterty na dole stosu wywołań będzie wynosić N * 50Mb. Jeśli funkcje zwracają transformowaną / zmodyfikowaną ramkę danych z głębi łańcucha wywołań, kopiowanie następuje przez inny N.

Pytanie SOJaki jest najlepszy sposób na uniknięcie przekazywania ramki danych? porusza ten temat, ale jest sformułowany w taki sposób, że unika się bezpośredniego zadawania pytania „pass-by-reference”, a zwycięska odpowiedź w zasadzie mówi „tak, pass-by-value to sposób, w jaki działa R”. To nie jest w 100% dokładne. Środowiska R umożliwiają semantykę pass-by-reference i OO, takie jakproto używaj tej możliwości w szerokim zakresie. Na przykład, gdy obiekt proto jest przekazywany jako argument funkcji, podczas gdy jego „magiczny wrapper” jest przekazywany przez wartość, do dewelopera R semantyka jest pass-by-reference.

Wydaje się, że przekazanie dużej ramki danych przez odniesienie byłoby częstym problemem i zastanawiam się, jak inni się do niej zbliżyli i czy są jakieś biblioteki, które to umożliwiają. W moich poszukiwaniach nie odkryłem żadnego.

Gdyby nic nie było dostępne, moim podejściem byłoby utworzenie obiektu proto, który otacza ramkę danych. Byłbym wdzięczny za wskazówki na temat cukru syntaktycznego, który powinien zostać dodany do tego obiektu, aby był użyteczny, np. Przeciążenie operatorów $ i [[jak również wszelkich innych elementów, na które powinienem zwrócić uwagę. Nie jestem ekspertem R.

Dodatkowe punkty za rozwiązanie typu agnostic pass-by-reference, które dobrze integruje się z R, choć moje potrzeby dotyczą wyłącznie ramek danych.

questionAnswers(1)

yourAnswerToTheQuestion