Я могу объяснить поведение, но не уверен, как правильно его решить (окружение причиняет мне боль).
Проблема в том, что ваша анонимная функция подбирает окружение.это среда, в которой он будет искать объекты, включая instList
.На первой итерации она получает эту среду <environment: 0x28e19a8>
, и это текущая среда для вашей функции, которая оценивается (assign.instrumentslist()
):
Browse[2]> environment()
<environment: 0x28e19a8>
На следующей итерации цикла значениеinstList
в текущей среде <environment: 0x28e19a8>
изменяется на "HO"
.Теперь и test.CL()
, и test.HO()
имеют одинаковое окружение, поэтому обращайтесь к одному и тому же instList
, который теперь имеет значение "HO"
.То же самое происходит в последней итерации для test.GC()
.Следующая отладочная расшифровка показывает это:
debug at #5: assign(paste("test", instList, sep = "."), function() {
print(instList)
}, envir = .GlobalEnv)
Browse[2]>
debug at #3: instList
Browse[2]> environment(test.CL)
<environment: 0x28e19a8>
Browse[2]> eval(instList, environment(test.CL))
[1] "CL"
Browse[2]>
debug at #5: assign(paste("test", instList, sep = "."), function() {
print(instList)
}, envir = .GlobalEnv)
Browse[2]>
debug at #3: instList
Browse[2]> environment(test.CL)
<environment: 0x28e19a8>
Browse[2]> eval(instList, environment(test.CL))
[1] "HO"
Когда цикл завершен, среда оценки assign.instrumentslist()
, <environment: 0x28e19a8>
сохраняется, поскольку она также является средой ваших трех функций.Все они ссылаются на одну и ту же среду и используют значение instList
, которое было установлено во время последней итерации вашего цикла.