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?
Ответы
Ответ 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])