Я думаю, что следующий будет решать проблему:
get("calls", envir=res)[[get("counter", envir=res)]] <- 2
терпит неудачу, потому что get
не replacement функция. С другой стороны, res$calls[[1]] <- 1
на самом деле является функцией замены, которую вы можете увидеть, если вы наберете help('[[<-')
. Это функция, используемая при выполнении задания. Я думаю, что причина, почему get
не имеет замены, например, (get<-
), заключается в том, что для этого существует определенная функция, которая называется assign
(согласно комментарию @TheTime).
Для второго случая val <- get("calls", envir=res)[[get("counter", envir=res)]]
создан в глобальной среде. При использовании assign("val", 2, envir=res)
переменная res$val
создается внутри res
среды, которые вы можете увидеть ниже:
> res$val
[1] 2
Однако val
остается тем же самым на глобальную окружающую среду, как 1:
> val
[1] 1
Таким образом, вы, вероятно, не сможет выполнить задание либо get
, либо assign
. get
не допустит этого, потому что это не функция замены и правопреемник упоминает:
правопреемник не отправляет методы назначения, поэтому он не может быть использован для установки элементов векторов, имена, атрибуты и т.д.
Итак, вы можете использовать обычный метод назначения [[<-
. @Frank в комментариях дает хороший способ:
res[[ "calls" ]][[ res[["counter"]] ]] <- 2
Кромка: объекты, переданные по ссылке, изменяются ссылкой. 'DT = data.table (1); set (get ("DT"), j = 1L, value = 2) ', который работает, потому что' get ("DT") 'является просто указателем на' DT'/по существу является 'DT'. Тем не менее, не используйте 'get', а. – Frank
Не уверен, что вы подразумеваете под «жестким кодом», но это отлично работает ... 'myfun = function (r, v) r [[" calls "]] [[r [[" counter "]]]] <- v; myfun (res, 2) 'просто расширив ответ ниже. По-моему, никто не предложил использовать '$'. – Frank
Я бы посоветовал метапрограммировать (помещая имя каждого объекта в строку), но 'myfun ((get (" res ")), 3)' отлично подходит для этого, если вы считаете, что вам нужно это сделать. – Frank