2013-03-08 3 views
3

Я пытаюсь заполнить набор матриц , где имена матриц (объектов) хранятся в списке. Я могу использовать get() для возврата объекта с заданным именем, но я , столкнувшись с проблемами функции, когда я использую get() для определения матрицы объекта, который я пытаюсь заполнить.Ошибка функции R get()

#Create list of matrix names: 
list.names <- c("m.1") 

#Create matrix object 
m.1 <- matrix(nrow=2,ncol=2) 

#Return matrix m.1 from the list.names using get(). Works great! 
get(list.names[1]) 

#Populate m.1 with some values. Doesn't work. 
get(list.names[1]) <- c(1,2,3,4) 

Таким образом, в последней строке кода, я получаю сообщение об ошибке:

не смог найти функцию «получить < -»

Точно так же, я могу назвать М.1 с помощью:

eval(as.name(list.name[1])) 

Но R возвращает аналогичную ошибку «не удалось найти функцию», когда я пытаюсь заполнить матрицу.

Может ли кто-нибудь объяснить ошибку в моем подходе, здесь?

Edit/Update:

Таким образом, в моей попытке упростить этот вопрос для размещения здесь, я понял, что, возможно, упрощенно, что я пытаюсь сделать.

Итак, я пытаюсь заполнить элементы в наборе матриц. Имена матриц содержатся в объекте list.names. Я использую вложенные петли for() для заполнения каждого элемента в матрицах.

Таким образом, на самом деле, моя проблема была бы более точно сформулировать:

get(list.names[1])[1,1] <- some_value 

Несколько ответов предположили, что я использую назначить основанный на моей должности, но, учитывая, что я attemping к «присваивать» элемент внутри объекта, а не весь объект, этот подход не будет работать.

Извините за путаницу.

+0

Я думаю, вы хотите «присваивать» как в 'assign (get (list.names [1]), 1: 4)'. Я не могу объяснить специфику, но объяснение может звучать примерно так: объект, возвращаемый с 'get'doesn't, имеет назначение (' <-'), что и указывает на ошибку.Все с оговоркой, что вы почти никогда не нуждаетесь в подобной гимнастике для достижения аналогичного результата. Расширение этого в другом вопросе может дать некоторые лучшие ответы, понимание и код. – Justin

+2

@ Justin Не совсем. Это 'get()', у которого нет функции присваивания, а не объекта, возвращаемого 'get()'. По сути, нет функции '' get <- '() 'и, следовательно, ошибки. Это синтаксический анализатор, который видит такую ​​конструкцию и преобразует ее в вызов '' get <- '(x = list.names [1], value = c (1,2,3,4)) 'еще до того, оценивает аргументы и, следовательно, ошибку о том, что не существует функции '' get <- "'. –

ответ

3

Используйте функцию assign вместо get:

assign(list.names[1],c(1,2,3,4)) 

get возвращает значение объекта, assign правопреемников. :)

То же самое с eval, он просто оценивает ваш звонок.

+0

Спасибо всем. Может ли назначаться использовать для изменения/заполнения одного элемента в объекте? На самом деле, мой код представляет собой серию вложенных циклов, в которых я использую вторичные функции для генерации значений элементов. Я попытался: назначить (list.names [1] [1,1], 1) без везения. – user2059737

+2

Возможно, вы захотите посмотреть 'с' и' внутри', ... 'assign' создает объект с именем, тогда как' with' и 'inside' разрешают доступ к внутренним компонентам. Почему бы вам не поставить более точное описание вашей проблемы? –

3

Это описано в FAQ 7.21. Самая важная часть этого FAQ - это конец, где говорится, что нужно использовать список (настоящий список, а не тот вектор, который вы вызываете в списке выше). Многое становится намного проще, если у вас есть список матриц, а не кучка матриц в вашем глобальном рабочем пространстве. Вот пример:

mnames <- c('m.1','m.2','m.3') 
m.1 <- matrix(1, 2, 2) 
m.2 <- matrix(2, 2, 2) 
m.3 <- matrix(3, 2, 2) 

## put matricies into a list 
mymats <- lapply(mnames, get) 
names(mymats) <- mnames 

## change 1 value in each matrix a different way 
mymats[['m.2']][1,1] <- 22 
mymats[[1]][2,2] <- 11 
tmp <- "m.3" 
mymats[[tmp]][1,2] <- 33 

## change the same element in each matrix using a loop 
for(i in seq_along(mymats)) { 
mymats[[i]][2,1] <- 44 
} 

## apply the same function to every matrix and simplify the output 
sapply(mymats, rowMeans) 

Это намного проще, чем возиться с get и assign.

+0

Awesome. Отлично. Благодаря! – user2059737

Смежные вопросы