2012-03-12 2 views
9

누구나 함수 내에서 변수 이름을 사용할 수 있는지 궁금합니다. 변수를 정렬하고 비트 맵을 생성하는 도트 플롯을 조합했습니다. 그러나 R을 사용하여 변수 이름을 plot 제목으로 전달할 수 없습니다.변수 이름을 플로팅 함수 제목에 전달하십시오.

예 데이터

함수의 둘째 줄에
id<-c(1,2,3) 
blood<-c(1,2,10) 
weight<-c(1,2,13) 


mydata<-as.data.frame(cbind(id,blood,weight)) 
mydata$blood 

#######SORTED DOT PLOT#### 


Dplotter<-function (id,x,Title=""){ 
if (is.null(Title)) {Title=""} else {Title=Title} 

DIR<-paste("C:/temp/WholePlots/New/",Title,".bmp",sep="") 

D<-as.data.frame(cbind(id,x)) 
x1<-as.data.frame(D[order(x),]) 

bmp(DIR) 
dotchart(x1$x,labels=id,main=Title,pch=16) 
dev.off() 
} 


############### 
Dplotter(mydata$id,mydata$blood,"Blood") 

Dplotter(mydata$id,mydata$weight,"Weight") 
  1. , 그래서 I '이 걸치는 것이

    `if (is.null(Title)) {Title=varname(x)} else {Title=Title}` 
    

    같은 가변 이름 것을 전달하고자 기능 제목 필드에 "Blood"를 넣어야합니다. (예 : Dplotter (mydata $ id, mydata $ blood)

    기본적으로 함수의 변수 이름에 어떻게 붙여 넣을 수 있습니까? 하나는 제목에서 데이터 세트의 이름을 취할 수 있다면 대신 mydata$blood을 받고, 당신은 단지 "피"를 얻을 있도록 는, (나는 들었다 데이터 세트를 연결하지 않고도 나쁜 연습) 더 나은 것 제목에.

    변수 이름에 붙여 넣기가 쉬운 솔루션을 찾지 못했습니다. 짐작할 수 있듯이 변수 이름을 paste() 함수에 넣으면 변수 값이 반환되므로 ( 플롯 제목은 변수 이름 대신 값으로 채워짐). 나는 또한 내가 단지 데이터 세트와 ID를 넣어, 다음 기능을 가질 수 있도록, 더욱 기능을 자동화하고 싶습니다

  2. 는 데이터 집합의 각 변수에 대한 을 반복했다. 분명히 이것은 질문 1을 먼저 해결해야합니다. 그렇지 않으면 제목과 파일 이름 모두에 문제가 발생합니다.

답변

13

일반적인 대답은 deparse(substitute(x))입니다. 예 :

set.seed(42) 
dat <- data.frame(x = rnorm(1:10), y = rnorm(1:10)) 
fooPlot(dat, col = "red") 

생산 :

using <code>deparse(substitute())</code> to title a plot

를 특정 예에서, 그래도 당신이 dat$x을 원하지 않기 때문에이 작동하지 않습니다 여기에

fooPlot <- function(x, main, ...) { 
    if(missing(main)) 
     main <- deparse(substitute(x)) 
    plot(x, main = main, ...) 
} 

가 사용 중입니다 제목으로, 당신은 단지 x을 원한다. 그러나 우리는 좀 더 조작을 할 수있는 :

fooPlot <- function(x, main, ...) { 
    if(missing(main)) { 
     main <- deparse(substitute(x)) 
     if(grepl("\\$", main)) { 
      main <- strsplit(main, "\\$")[[1]][2] 
     } 
    } 
    plot(x, main = main, ...) 
} 

fooPlot(dat$x, col = "red") 위해주는 :

second attempt

참고이 코드는 몇 가지 가정을, main은 오직이있을 것이다, 벡터 아니라고 플롯에 전달 된 객체에 하나의 $이 있습니다 (예 : 위 코드와 같이 중첩 목록을 사용할 수 없음).

+0

대단히 감사합니다. 그것은 정말 잘 작동합니다. 누구나 2 (질문 2, 위 참조)하는 방법에 대한 제안 사항이 있습니까? 예를 들어 foo plot을 다른 함수 "PlotALL"내에서 실행하면 데이터 세트의 모든 변수가 하나씩 foo plot으로 전달됩니다. 이렇게하면 ## PlotAll (id, mydata) 을 쓰고 모든 그래프를 인쇄 할 수 있습니다. 많은 감사합니다 –

1

문자열 집합과 변수 이름을 검색하여 플롯 및 파일 이름의 제목으로 사용해야합니다.

트릭을 설명하기 위해 longley 데이터 세트를 사용합니다. longley [내가] "로"그렇지 않으면 바보를 제공하기 때문에, "

var.names=names(longley) 
file.names=paste(var.names, "bmp", sep=".") 
#with an extra step to prefix a directory to those filenames 

for (i in 1:ncol(longley)) { 

    bmp(file=file.names[i]) 
    plot(longley[[i]], main=var.names[i], ylab="") 
    dev.off() 
} 

ylab ="변수 이름 및 파일 이름 :

data(longley, package="datasets") 

#return a vector with variable names 
colnames(longley) 
names(longley) #equivalent 

#get the name of a specific variable (column number): 
names(longley)[1] 

문자열 두 세트를 얻을 각 변수를 플롯 y- 레이블을 사용하고, ylab로 var.name [i]를 사용하면 중복 될 수 있습니다.

+0

친애하는 p_barill, 그게 꼭 필요한 것입니다. 도와 주셔서 정말 감사합니다. –

관련 문제