Я пытаюсь генерировать ссылочные классы в R-пакете "на лету", и это оказывается довольно сложным. Вот те подходы, которые я предпринял, и проблемы, с которыми я столкнулся:
Я создаю пакет, в котором я надеюсь иметь возможность динамически читать в схеме и автоматически генерировать связанный ссылочный класс (думаю, SOAP). Конечно, это означает, что я не буду в состоянии определять свои ссылочные классы в источниках пакетов.
Сначала я попытался создать новый класс с помощью простого:
myClass <- setRefClass("NewClassName", fields=list(fieldA="character"))
который, конечно, отлично работает при выполнении интерактивно, но когда он включен в источники пакета, я получаю ошибку locked binding
. Из моего чтения это выглядит так, потому что при запуске в интерактивном режиме информация о классе хранится в глобальной среде, которая не заблокирована, а базовая среда моего пакета заблокирована.
Затем я нашел поток, который предложил использовать что-то для эффекта:
myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=globalenv())
Это фактически разбило R/Studio, когда я пытался создать пакет, поэтому у меня нет журнала ошибки, сгенерированной, к сожалению, но это, безусловно, не сработало.
Далее я попытался создать новую среду в моем пакете, которую я мог бы использовать для хранения этих ссылочных классов. Поэтому я добавил строку .classEnv <- new.env()
в своих источниках пакетов (не внутри какой-либо функции), а затем попытался использовать этот класс при создании нового ссылочного класса:
myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=.classEnv)
Это действительно работало нормально, но генерирует следующее предупреждение:
> myClass <- setRefClass("NewClassName", where=.classEnv)
Warning message:
In getPackageName(where) :
Created a package name, ‘2013-04-23 10:19:14’, when none found
Итак, по какой-то причине methods::getPackageName()
не может выбрать, в каком пакете находится моя новая среда?
Есть ли способ создать новую среду по-другому, чтобы getPackageName()
мог правильно распознать пакет? Могу ли я добавить некоторую функцию, которая позволяет мне помочь getPackageName()
обнаружить пакет? Будет ли это работать, если я смогу справиться с предупреждением, или я злоупотребляю ссылочными классами, пытаясь создать их динамически?