2014-10-02 14 views
6

Prendete questo oggetto come un esempio:trovare facilmente e sostituzione ogni partita in un elenco nidificato

expr <- substitute(mean(exp(sqrt(.)), .)) 

Si tratta di un elenco nidificato. Voglio trovare ogni elemento che corrisponde a quote(.).

Ad esempio, la soluzione s' magrittr corrisponde solo il primo livello della chiamata:

dots <- c(FALSE, vapply(expr[-1], identical, quote(.), 
         FUN.VALUE = logical(1))) 
dots 
[1] FALSE FALSE TRUE 

ma volevo trovare ogni '' in una lista annidata arbitraria. In questo caso particolare questo sarebbe questi due punti:

expr[[3]] 
expr[[2]][[2]][[2]] 

e poi questi punti devono essere sostituiti:

expr[[3]] <- as.name("replacement") 
expr[[2]][[2]][[2]] <- as.name("replacement") 
expr 
# mean(exp(sqrt(replacement)), replacement) 

Come si farebbe questo?

risposta

7

Utilizzando una funzione ricorsiva:

convert.call <- function(x, replacement) { 
    if (is.call(x)) as.call(lapply(x, convert.call, replacement=replacement)) else 
    if (identical(x, quote(.))) as.name(replacement) else 
     x 
} 

convert.call(expr, "x") 
# mean(exp(sqrt(x)), x) 
+0

+1 veramente bello. –

Problemi correlati