2013-03-08 6 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) 

, 나는 오류 받고 있어요 :

기능을 찾을 수 없습니다

"얻을 < -"유사

를, 내가 사용 M.1를 호출 할 수

그러나 매트릭스를 채울 때 R이 비슷한 '함수를 찾을 수 없습니다.'오류를 반환합니다.

누군가 내 접근 방식에서 오류를 설명 할 수 있습니까?

편집/업데이트 :

그래서 여기에 게시에 대한 질문을 단순화하기 위해 내 시도에, 나는 내가 할 시도하고있는 무슨을 과도하게 단순화 한 수 있음을 깨달았다.

사실, 사실, 나는 집합의 요소 내에서 요소를 채우려고 시도하고 있습니다. 행렬의 이름은 list.names 객체에 포함됩니다. for() 루프를 사용하여 행렬 내의 각 요소를 채 웁니다.

그래서, 사실, 내 문제는 더 정확하게 명시된 바와 같이 될 것이다 :

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

답장의 몇 내 원래의 게시물에 따라 할당하는 사용하는 것이 좋습니다,하지만 난을 시도하셨습니다있어 주어진했다 전체 객체가 아닌 객체 내의 요소를 '할당'하면이 접근 방식은 작동하지 않습니다.

죄송합니다.

+0

당신이'assign (get (list.names [1]), 1 : 4)'처럼'assign'을 원한다고 생각합니다. 구체적으로 설명 할 수는 없지만, 설명은 "get"에서 반환 된 객체는 오류로 표시되는 할당 ('<-') 메서드를 갖지 않습니다.비슷한 결과를 얻기 위해 이런 종류의 체조가 절대로 필요하지 않다는 경고가 있습니다. 이것을 다른 질문으로 확장하면 더 나은 해답, 이해 및 코드를 얻을 수 있습니다. – Justin

+2

@ Justin Not quite. 'get()'에 의해 반환 된 객체가 아닌 할당 함수를 가지지 않는 것은'get()'입니다. 근본적으로''get <- '()'함수가 없으므로 오류가 발생합니다. 파서는 이러한 종류의 구문을보고이를 "get <- '(x = list.names [1], value = c (1,2,3,4))'호출로 변환합니다. ''get <- "'함수가 존재하지 않는다는 것에 대한 인자와 그에 따른 에러를 평가합니다. –

답변

3

사용 기능을 대신 getassign :

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

get이 개체 값, assign 양수인을 반환합니다. :)

동일한 것을 eval와 함께 사용하면 통화가 평가됩니다.

+0

모두에게 감사드립니다. 객체의 단일 요소를 변경/채우는 데 할당을 사용할 수 있습니까? 사실, 제 코드는 요소 값을 생성하는 보조 함수를 사용하는 일련의 중첩 루프입니다. 내가 시도 : 행운을하지 않고 (list.names [1] [1,1], 1). – user2059737

+2

'with'와'within'을 보길 원할 것입니다,'assign'는 이름을 가진 객체를 생성하는 반면,'with'와'within'는 내부 컴포넌트에 대한 접근을 허용합니다. 왜 당신의 문제에 대한보다 정확한 설명을 넣지 않습니까? –

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) 

getassign와 장난보다 훨씬 간단하다 예를 들면 다음과 같습니다.

+0

굉장합니다. 완전한. 감사! – user2059737