Я создаю пакет R с классами S4, и у меня проблемы с функцией new
. У меня есть класс Configs
setClass("Configs",
slots = list(
burnin = "numeric",
chains = "numeric",
features = "numeric",
iterations = "numeric",
mphtol = "numeric",
samples = "numeric",
seed = "numeric",
thin = "numeric",
verbose = "numeric"
),
prototype = list(
burnin = 0,
chains = 2,
features = 5,
iterations = 5,
mphtol = 1e-4,
samples = 3,
seed = sample(1e6, 1),
thin = 0,
verbose = 0
)
)
и когда я загружаю только эту часть в свою глобальную среду, я могу создать новый объект Configs
со слотами, отличными от значений по умолчанию.
> new("Configs", features = 1000)
An object of class "Configs"
Slot "burnin":
[1] 0
Slot "chains":
[1] 2
Slot "features":
[1] 1000
Slot "iterations":
[1] 5
Slot "mphtol":
[1] 1e-04
Slot "samples":
[1] 3
Slot "seed":
[1] 437211
Slot "thin":
[1] 0
Slot "verbose":
[1] 0
Однако, когда я устанавливаю весь пакет, загружаю его в новую среду и запускаю new("Configs", features = 1000)
, я получаю features
из 5. Почему new()
больше не помещает значения в слоты?
Мой пакет прошел R CMD check
без ошибок, предупреждений или примечаний. Вот информация о моей сессии.
> sessionInfo()
R version 3.2.0 (2015-04-16)
Platform: x86_64-unknown-linux-gnu (64-bit)
Running under: CentOS release 6.6 (Final)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] heterosis_0.0 pracma_1.8.3 MCMCpack_1.3-3 MASS_7.3-40 coda_0.17-1
loaded via a namespace (and not attached):
[1] tools_3.2.0 grid_3.2.0 lattice_0.20-31
Изменить: я понял, но все еще не удовлетворен.
Оказывается, моя функция initialize
вызывала проблемы.
setMethod("initialize", "Configs", function(.Object, ...){
# .Object = new("Configs", ...)
validObject(.Object)
return(.Object)
})
Когда я его снимаю, new
снова вставляет вещи в слоты. Я рад, что обнаружил проблему, но не хочу полностью удалять функцию инициализации. Мне нужен удобный способ вызова validObject и выполнения других проверок ошибок, и initialize
кажется подходящим и подходящим местом для этого. И если я раскомментирую закомментированную строку, я получу бесконечную рекурсию. Как создать конструктор, не нарушая new
?