2014-12-01 3 views
0

Как назначить динамически создаваемому вектору?Назначение динамически созданного вектора

master<-c("bob","ed","frank") 
d<-seq(1:10) 
for (i in 1:length(master)){ 
    assign(master[i], d) 
} 

eval(parse(text=master[2]))[2] # I can access the data 

# but how can I assign to it THIS RETURNS AN ERROR  ####################### 
eval(parse(text=master[2]))[2]<- 900 
+0

Используйте 'получить (мастер [2])' Использование Eval, как правило, рассматривается как доказательство отсутствия. но если вы действительно этого хотите, попробуйте: 'eval (as.name (maste г [2])) '. Существует разделение между объектами данных и языковыми объектами. Поэтому 'get' и' as.name' можно рассматривать как «продвижение» статуса объекта символа на объект языка. –

+0

@Bonded get (master [2]) [2] <- 900 возвращает ERROR – user3022875

+0

Не удалось найти желаемый результат. Если вы хотите выполнить назначение, то почему бы не использовать .... 'assign'? –

ответ

0

OK. Я отправлю этот код, но только потому, что меня попросили:

> eval(parse(text=paste0(master[2], "[2]<- 900"))) 
> ed 
[1] 1 900 3 4 5 6 7 8 9 10 

Обычно считается неправильной практикой использования такого метода. Вам нужно построить выражение «ed[2] < 100». Используя paste0, вы можете оценить master [2] как 'ed', который затем объединяется с остальными символами, прежде чем перейти к parse для преобразования в объект языка. Это будет больше соответствовать тому, что считается лучшей практикой:

master<-c("bob","ed","frank") 
d<-seq(1:10) 
mlist <- setNames(lapply(seq_along(master), function(x) {d}), master) 

Таким образом изменяя второе значение второго элемента с <-:

> mlist[[2]][2] <- 900 
> mlist[['ed']] 
[1] 1 900 3 4 5 6 7 8 9 10 
+0

Какова была бы лучшая практика? – user3022875