for 루프에서 변수 이름 목록을 생성 한 후 값을 지정하십시오.


27

for 루프를 사용하여 변수 목록을 생성하고 그 값을 제공하는 간단한 방법이 있는지 궁금합니다.

for(i in 1:3)
{
  noquote(paste("a",i,sep=""))=i
}

위의 코드에서, 내가 만들려고 a1, a2, a3, 1, 2, 3. 그러나, R는 오류 메시지를 제공의 값으로하는 할당합니다. 당신의 도움을 주셔서 감사합니다.


3
나는 당신이 이것을해야한다고 의심합니다. 아주 잘못된 방식으로 무언가를 만들고있는 것 같습니다.

예를 들어 Eviews 에서 @mbq 는 일반적인 코딩 방법입니다. 내가 그것을 옹호하는 것은 아닙니다. Eviews는 저의 가장 악한 소프트웨어 목록에서 Excel보다 조금 낮습니다 :)
mpiktas

6
@mpiktas R에서는 목록을 만들고, names매개 변수를 설정 한 다음 나중에 그냥 사용 attach하거나 내부 list2enveval내부 환경으로 변환 하는 것이 더 자연 스럽 습니다. 루프가 없거나 구문 분석 또는 기타 추한 내용이 없습니다.

@mbq, hm list2env은 비교적 새로운 기능입니다. 그리고 OP가 최상위 환경에서 변수를 얻으려고 할 때 일부 환경에서 변수를 생성합니다. 추한 여전히 남아 있습니다 :)
mpiktas

2
비슷한 성격의 향후 질문에 대해서는 이러한 종류의 질문이 실제로 StackOverflow에 속한다고 제안합니다. 문제는 통계 그 자체와 아무 관련이 없습니다.
Mars

답변:


41

찾고 있습니다 assign().

for(i in 1:3){
  assign(paste("a", i, sep = ""), i)    
}

준다

> ls()
[1] "a1"          "a2"          "a3" 

> a1
[1] 1
> a2
[1] 2
> a3
[1] 3

최신 정보

나는 루프를 사용하는 것이 (매우 자주) 나쁜 R 코딩 스타일이라는 것에 동의한다 (위의 논의 참조). 사용 list2env()(그것을 언급에 대한 @mbq 감사는)이 @Han 린 샹의 질문에 또 다른 솔루션입니다 :

x <- as.list(rnorm(10000))
names(x) <- paste("a", 1:length(x), sep = "")
list2env(x , envir = .GlobalEnv)

21

값이 벡터 인 경우 루프가 필요하지 않습니다.

vals <- rnorm(3)
n    <- length(vals)
lhs  <- paste("a",    1:n,     sep="")
rhs  <- paste("vals[",1:n,"]", sep="")
eq   <- paste(paste(lhs, rhs, sep="<-"), collapse=";")
eval(parse(text=eq))

부수적으로, 이것이 R을 좋아하는 이유입니다.


4
library(fortunes) fortune(106)
Roman Luštrik

@Roman, 이상합니다 parse.R 도움말 페이지를 읽은 후 사용하기 시작했습니다 . 때로는 formula경영진과 같이 때로는 과잉이라는 데 동의 하지만 매우 유용하다는 것을 알았습니다. 내가 질문하지 않았기 때문에 운에 제안 된대로 질문을 다시 생각할 수는 없습니다.
mpiktas 12

1
@mpiktas : 기본 범위 지정 규칙이 함수 내에서 사용될 때 예기치 않은 결과를 초래할 수 있다는 사실과 관련이 있습니다. 또한 도움말 파일에 언급 된대로 범위 지정 규칙의 차이로 인해 R과 S가 다른 결과를 제공 할 수 있습니다. 다른 솔루션보다 느립니다. 이 작업을 여러 번 수행해야 할 때 중요합니다. 마지막으로, 대부분의 경우 eval (parse ())를 사용하는 것보다 더 우아하고 쉬운 솔루션이 있습니다. 이 경우 목록으로 작업하거나 assign을 사용합니다.
Joris Meys

1
@mpiktas : 나는 그것이 부족하다고 말한 적이 없습니다. 나는 R 코어 개발 팀의 일원 인 Thomas Lumley와 같이 일반적으로 eval (parse ()) 구문을 권장하는 이유를 설명했습니다. (@Roman Lustrik의 refernce를을 CFR)
요리스 MEYS에게

1
assign, 여러 단일 요소 변수를 만드는 것과 같은 나쁜 습관은 권장하지 않습니다.
mdsumner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.