2011-04-26 14 views
20

Me gustaría dar un argumento de params a una función y luego adjuntarlo para que pueda usar un en lugar de params $ a cada vez que me refiero al elemento de lista a.attach() dentro de la función

run.simulation<-function(model,params){ 
attach(params) 
# 
# Use elements of params as parameters in a simulation 
detach(params) 
} 

¿Hay algún problema con esto? Si he definido una variable global llamada c y también he definido un elemento llamado c de la lista "params", ¿qué valor se usaría después del comando attach?

Respuesta

25

Noah ya ha señalado que usar attach es una mala idea, aunque lo veas en algunos ejemplos y libros. Hay una forma de evitarlo Puede usar "adjunto local" que se llama with. En el ejemplo ficticio de Noah, esto se vería como

with(params, print(a)) 

que arrojará el mismo resultado, pero es más ordenado.

+4

+1 pena explicar lo que 'con()' y 'dentro de()' hacer. En el ejemplo dado, 'with()' crea un entorno a partir de 'params' y luego evalúa la expresión' print (a) '_inside_ ese entorno. Por lo tanto, los componentes de 'params' son visibles cuando se evalúa la expresión, sin necesidad de' attach() '. –

+0

Muchas gracias por las respuestas lúcidas. –

+0

Entonces, lo que funcionó al final fue 'myFun <-function (model, params) {with (params), {...}}' donde ... es el cuerpo de la función –

8

La manera más fácil de resolver problemas de alcance de este tipo es por lo general para tratar algo simple Salida:

a = 1 
params = c() 
params$a = 2 
myfun <- function(params) { 
    attach(params) 
    print(a) 
    detach(params) 
} 
myfun(params) 

El objeto (s) siguiente están enmascarados _by_ .GlobalEnv:

a

# [1] 1 

Como puede ver, R está recogiendo th e atributo global a aquí.

es casi siempre una buena idea evitar el uso attach y detach siempre que sea posible - el alcance termina siendo difícil de manejar (por cierto, también es posible para evitar nombrar las variables c - R menudo se darán cuenta de lo que usted se refiere a, pero hay tantas otras cartas por ahí, ¿por qué arriesgarse?). Además, encuentro que el código que usa adjuntar/separar es casi imposible de descifrar.

6

Otra posibilidad es:

run.simulation <- function(model, params){ 
    # Assume params is a list of parameters from 
    # "params <- list(name1=value1, name2=value2, etc.)" 
    for (v in 1:length(params)) assign(names(params)[v], params[[v]]) 
    # Use elements of params as parameters in a simulation 
} 
Cuestiones relacionadas