Sto provando a creare un set di dati prima di tracciarlo. Ho deciso di usare la funzione di fabbrica gammaplot.ff()
e la prima versione del mio codice simile a questo:Evita la conversione da rbind()/cbind() da numerico al fattore
PowerUtility1d <- function(x, delta = 4) {
return(((x+1)^(1 - delta))/(1 - delta))
}
PowerUtility1d <- Vectorize(PowerUtility1d, "x")
# function factory allows multiparametrization of PowerUtility1d()
gammaplot.ff <- function(type, gamma) {
ff <- switch(type,
original = function(x) PowerUtility1d(x/10, gamma),
pnorm_wrong = function(x) PowerUtility1d(2*pnorm(x)-1, gamma),
pnorm_right = function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma)
)
ff
}
gammaplot.df <- data.frame(type=numeric(), gamma=numeric(),
x=numeric(), y=numeric())
gammaplot.gamma <- c(1.1, 1.3, 1.5, 2:7)
gammaplot.pts <- (-1e4:1e4)/1e3
# building the data set
for (gm in gammaplot.gamma) {
for (tp in c("original", "pnorm_wrong", "pnorm_right")) {
fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)
dataChunk <- cbind(tp, gm, gammaplot.pts, fpts)
colnames(dataChunk) <- names(gammaplot.df)
gammaplot.df <- rbind(gammaplot.df, dataChunk)
}
}
# rbind()/cbind() cast all data to character, but x and y are numeric
gammaplot.df$x <- as.numeric(as.character(gammaplot.df$x))
gammaplot.df$y <- as.numeric(as.character(gammaplot.df$y))
Risulta, l'intera struttura di dati contiene i dati di carattere, quindi devo riconvertirlo manualmente (mi ha portato un po 'per scoprire che in primo luogo!). Ricerca SO indicates che ciò accade perché la variabile tipo è carattere. Per evitare questo (! Si può immaginare i problemi di prestazioni sui dati di caratteri, mentre la costruzione del set di dati) ho cambiato il codice un po ':
gammaplot.ff <- function(type, gamma) {
ff <- switch(type,
function(x) PowerUtility1d(x/10, gamma),
function(x) PowerUtility1d(2*pnorm(x)-1, gamma),
function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma)
)
ff
}
for (gm in gammaplot.gamma) {
for (tp in 1:3) {
fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)
dataChunk <- cbind(tp, gm, gammaplot.pts, fpts)
colnames(dataChunk) <- names(gammaplot.df)
gammaplot.df <- rbind(gammaplot.df, dataChunk)
}
}
Questo funziona bene per me, ma ho perso un parametro di carattere auto-esplicativo, che è un rovescio della medaglia. C'è un modo per mantenere la prima versione della fabbrica di funzioni senza una conversione implicita di tutti i dati al carattere?
Se c'è un altro modo per ottenere lo stesso risultato, sarei felice di provarlo.
@Thomas, la tua risposta breve è chiaramente sbagliata; vedi risposta accettata Inoltre, affermare che non si dovrebbe fare qualcosa senza un'alternativa non è costruttivo. –