Подтвердить что ты не робот

Attach() внутри функции

Я хотел бы дать аргумент params функции, а затем присоединить его, чтобы я мог использовать вместо params $a каждый раз, когда я ссылаюсь на элемент списка a.

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

Есть ли проблема с этим? Если я определил глобальную переменную с именем c и также определил элемент c с списком "params", значение которого будет использоваться после команды attach?

4b9b3361

Ответ 1

Ной уже указал, что использование приставки - плохая идея, хотя вы видите это в некоторых примерах и книгах. Есть способ обойти. Вы можете использовать "local attach", который называется with. В примере с Noah dummy это выглядело бы как

with(params, print(a))

который даст идентичный результат, но является более аккуратным.

Ответ 2

Самый простой способ разрешить такие проблемы, как это, - это, как правило, попробовать что-то простое:

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

Следующие объекты маскируются _by_ .GlobalEnv:

a

# [1] 1

Как вы можете видеть, R выбирает глобальный атрибут a здесь.

Практически всегда рекомендуется избегать использования attach и detach, где это возможно - область заканчивается сложной задачей (кстати, также лучше избегать именования переменных c - R часто будет выяснять что вы имеете в виду, но есть так много других писем, зачем рисковать?). Кроме того, я обнаружил, что код, использующий attach/detach, почти невозможно расшифровать.

Ответ 3

Другая возможность:

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
}

Ответ 4

Ответ Жан-Люка очень помог мне в том случае, когда у меня был data.frame Dat вместо списка, как указано в OP:

for (v in 1:ncol(Dat)) assign(names(Dat)[v], Dat[,v])