Проблемы с областью инициализации сложных объектов с вложенными функциями

StackOverflow https://stackoverflow.com/questions/1586744

Вопрос

Итак, я пытаюсь использовать классы S4 для создания очень сложного объекта со слотами, включающими полдюжины матриц, несколько списков и, возможно, одну или две кухонные мойки.Объект инициализируется путем обращения к объекту конфигурации, который я уже определил, и его распаковке.Определить класс с помощью setClass() достаточно просто, но мне трудно найти элегантный способ установки слотов в setMethod("initialize").

Проблема в том, что мне нужно установить определенные элементы этих полдюжины матриц на основе частей этого объекта конфигурации.Для каждого элемента объекта конфигурации мне, возможно, придется установить определенные элементы нескольких матриц.Обратите внимание, что матрицы находятся в области действия/среде функции инициализации.Затем у меня есть вложенные функции в функцию инициализации, которые фактически присваивают матрицам, или в любом случае это идея.Эти функции, конечно, могут видеть матрицы, но они не могут изменить их, потому что оператор <- создает новую матрицу, если исходная переменная не была определена в текущей среде.R является передачей по значению и означает это.Это справедливо даже для слотов .Object, который я пытаюсь инициализировать.Поэтому я не могу использовать вложенные функции для инициализации.

К сожалению, этим вложенным функциям приходится изменять несколько матриц, поэтому возврат значений и выполнение присваивания в основной функции инициализации непрактично и неэлегантно.(Но это возможно, если я поместил копии матриц в возвращаемые списки, а затем объединил их в основной функции инициализации.Хотя это некрасиво и потребует много дополнительного кода.)

А итерация (которая предотвратила бы эту проблему с областью действия) также не очень практична из-за иерархической природы объекта конфигурации, который действительно хочет пройти с помощью рекурсивных вызовов.

Последний вариант, который я могу придумать, — это использовать функцию Assign() с опцией envir, чтобы принудительно применить присвоение к нелокальной переменной.Но использование таких сред кажется неприятным, как оператор перехода...

Итак, какой подход самый пиратский?Придерживаться чистого функционального программирования и создавать уродливые структуры данных только для того, чтобы неэффективно передавать избыточные матрицы?Попытаться найти итеративное решение, которое вообще избегает функций?Использовать глубокую магию, играя с окружением?

Это было полезно?

Решение

Вы посмотрели <<- ?Это делает назначение в родительской среде немного проще.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top