2012-05-25 2 views
2

각 클래스는 화학 물질 (예 : 금속, PCB 등)을 기반으로 한 일련의 플롯 생성을 자동화하고 있습니다. 내가 생략 할 이유는 음모의 외부에있는 전설을 플로팅하고 legend() 함수 (예 : inset = c(-0.2, 0))에 대해 inset 인수에 음수 값을 사용하는 것입니다. 각 화학 클래스는 inset에 대해 다른 값을 필요로하기 때문에 각 화학 클래스에 필요한 값을 저장하기 위해 hash 패키지를 사용하여 해시 테이블을 만드는 방법을 생각했습니다. 그러나 이것을 해시 테이블에 저장하기 위해 값의 벡터를 문자열 (예 : "c (-0.2, 0)")로 저장했습니다. 해시 테이블에 대한문자열을 함수로 표현하십시오. R

내 코드는 다음과 같습니다 legend.hash <- hash(chem.class, c('c(-0.2, 0)', 'c(-0.2, 0)', 'c(-0.25, -0.4)', 'c(-0.25, -0.3)', 'c(-0.2, 0)', 'c(-0.4, -0.2)', 'c(-0.2, 0)', 'c(-0.2, 0)')) chem.class 화학 클래스의 벡터이다.

결과 해시 테이블에서 값을 가져 오는 것은 분명히 문자열이므로이 문자열을 변환하여 R이 다음과 같이 사용할 수있는 함수로 해석하도록 할 수 있습니까? legend(..., inset = legend.hash[[chem.class[i]]])?

기존의 그래픽 시스템을 사용하여 더 좋은 방법을 구현할 수 있습니까?

> eval(parse(text="c(-0.2,0)")) 
[1] -0.2 0.0 

그러나 간단한 목록 대신 해시를 사용하여 주장하는 이유 정말 궁금 :

+2

왜 단순히 목록을 사용할 수 없습니까? – joran

+0

전설을 그리기 위해 여러 개의 인세 트 값이 필요한 예제가 궁금합니다. 그것보다 훨씬 간단합니다. – baptiste

+0

범례 내의 아이템 수와 길이는 일련의 플롯을 통해 대폭 변경됩니다 (1 ~ 40 개 항목까지). 각 플롯에 대해 인세 트를 동일하게 유지하면 전설이 페이지 여백을 넘어서게됩니다. – sinclairjesse

답변

6

가 함수 인 것처럼 문자열을 실행하는 고전적인 방법은 eval()parse()을 사용하는 것입니다.

legend.hash <- list(c(-0.2, 0), c(-0.2, 0), c(-0.25, -0.4), c(-0.25, -0.3), 
       c(-0.2, 0), c(-0.4, -0.2), c(-0.2, 0), c(-0.2, 0)) 
names(legend.hash) <- chem.class 

특히 악명 높은 fortune(106)에 대한 생각, 당신은 모든 까다로운 비트와 eval()parse()의 조각없이 현재 사용하고있는 정확한 구조를 사용할 수 있도록합니다 :

> require(fortunes) 
> fortune(106) 

If the answer is parse() you should usually rethink the question. 
    -- Thomas Lumley 
     R-help (February 2005) 
+0

완벽. 솔직히 말해서, 목록의 유용성은 때로는 나를 빠져 나간다. 나는 그들과 더 많은 시간을 보낼 필요가 있음은 분명하다. 감사! 또한 - 여분의 지혜를 주셔서 감사합니다 :) – sinclairjesse

+0

후속 조치로, 순전히 속도 증가를 위해리스트를 통해 해시 테이블을 사용하겠습니까? – sinclairjesse

+0

이 크기의 예를 들어, 목록에서 해시의 속도 차이가 무시할 수있을 것이라고 기대할 수 있습니다 (수백만 번 작업을 수행하지 않는 한). 아마도 (???) 문자열을 적절한 숫자 - 벡터 형식으로 되돌리려면'eval (parse()) '할 필요가 없어서 완전히 무효화됩니다 ... –

1

그것은 작동 할 수 음수 인세 트를 사용하는 대신 grconvertXgrconvertY 함수를 사용하여 범례를 배치하는 것이 좋습니다.

+0

이 답변이나 의견 ... –

+0

문자열을 변환하는 것보다 전설을 배치하는 더 좋은 방법이 있다는 원래 질문의 마지막 줄에 대한 대답으로 의미가 있습니다. –

1

숫자 값이 2 개인 문자열을 숫자 벡터로 변환하려면 gsubfn 패키지의 strapply 함수를 사용하는 것이 좋습니다. 이 방법을 사용하면 parse 기능과 함께 제공되는 모든 잠재적 인 골칫거리를 피할 수 있습니다. 또한 더 빨리 끝날 수도 있습니다.

문자열을 숫자와 분리 기호 ('c'및 괄호 제외) 만 변경하면 을 strsplit의 결과에 더 빨리 사용할 수 있습니다.

관련 문제