2017-06-30 7 views
1

J'ai un code qui crée un objet à partir d'une formule et enregistre l'appel pour une utilisation ultérieure, comme si:appel de fonction d'économie R avec la formule pour les réutiliser dans bootstrapping

create_obj <- function(formula, data) { 
    obj <- list() 
    # Populate obj with whatever we're interested in 
    # ...   

    # Save call for future use 
    obj$call <- match.call() 
    obj 
} 

obj <- create_obj(time ~ sex, data) 

Si je puis bootstrap data I peut facilement construire le modèle sur le nouveau jeu de données:

data <- data[sample(1:nrow(data), replace=T), ] 
new_obj <- eval(obj$call) 

Cependant, si je la formule enregistrée dans une variable et je passe l'objet dans un nouvel environnement cela ne fonctionnera pas:

do_stuff <- function(object, newdata) { 
    data <- newdata[sample(1:nrow(newdata), replace=T), ] 
    new_object <- eval(object$call) 
} 

main <- function() { 
    my_form <- time ~ sex 
    obj2 <- create_obj(my_form, data) 
    # obj2$call: 'create_obj(formula = my_form, data = data)' 

    do_stuff(obj2, data) 

} 

Erreur: objet my_form introuvable. Comment puis-je l'avoir pour que obj$call enregistre time~sex plutôt que myform? Sinon, j'ai besoin de passer la formule elle-même plutôt que seulement l'objet, ce qui limite la praticité.

L'exemple ci-dessus n'est pas reproductible mais vous pouvez voir la même chose avec un appel lm standard.

EDIT: J'ai résolu le problème, voir la réponse acceptée.

Répondre

0

je l'ai résolu en ayant la fonction de constructeur modifie l'appel en évaluant l'argument constant dans l'environnement local:

create_obj <- function(formula, data) { 
    obj <- list() 
    # Populate obj with whatever we're interested in 
    # ...   

    # Save call for future use 
    func_call <- match.call() 
    func_call$formula <- eval(formula) 

    # obj_call is now: create_obj(formula=time~sex, data=data) 
    obj$call <- func_call 
    obj 
}