Sto costruendo un pacchetto R con classi S4 e ho problemi con la funzione new
. Ho una classe denominata Configs
Classi S4: gli argomenti passati a new() non vanno nei loro slot
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
)
)
e quando carico proprio questa parte nel mio ambiente globale, posso creare un nuovo oggetto con Configs
slot diversi da quelli predefiniti.
> 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
Tuttavia, quando installo l'intero pacchetto, caricarlo in un ambiente fresco, e correre new("Configs", features = 1000)
, ho un features
di 5. Perché non new()
valori messi in slot più?
Il mio pacco ha superato R CMD check
senza errori, avvisi o note. Ecco le mie informazioni sulla sessione.
> 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
Edit: Ho capito, ma non sono ancora soddisfatto.
Si scopre che la mia funzione initialize
stava causando problemi.
setMethod("initialize", "Configs", function(.Object, ...){
# .Object = new("Configs", ...)
validObject(.Object)
return(.Object)
})
Quando lo rimuovo, new
inserisce nuovamente gli oggetti negli slot. Sono contento di aver trovato il problema, ma non voglio rimuovere completamente la mia funzione di inizializzazione. Voglio un modo conveniente per chiamare validObject e fare anche un altro controllo degli errori, e initialize
sembra un posto adeguato e appropriato per farlo. E se disapprovo la riga commentata, ottengo una ricorsione infinita. Come posso creare un costruttore senza interrompere new
?
Grazie, questo aiuta. In realtà volevo saperne di più sui costruttori in R senza rendermene conto. – landau