2012-03-12 18 views
9

Tôi đã tự hỏi nếu có ai có thể giúp tôi sử dụng tên biến trong một hàm. Tôi đã đặt cùng một ô dấu chấm phân loại các biến và sau đó tạo ra một bitmap, nhưng tôi không thể nhận được R để chuyển tên biến cho tiêu đề plot.Vượt qua tên biến để vẽ tiêu đề chức năng

Ví dụ dữ liệu

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. Trong dòng thứ hai của hàm, tôi muốn vượt qua trên tên biến, một cái gì đó giống như

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

    vì vậy mà tôi don' t phải đặt "máu" trong trường chức năng Tiêu đề (ví dụ: Dplotter (id $ mydata, mydata $ blood)

    Về cơ bản, làm thế nào để dán một tên biến trong một hàm? Nó sẽ tốt hơn nếu ta có thể lấy tên tập dữ liệu từ tiêu đề (mà không kèm theo tập dữ liệu, mà tôi đã nói là xấu thực hành), để thay vì nhận được mydata$blood, bạn chỉ nhận được "máu" trong tiêu đề.

    Tôi đã không tìm thấy giải pháp dễ dàng để dán tên biến trong một hàm. Như bạn có thể đoán, đặt tên biến trong hàm paste() trả về giá trị của biến (để tiêu đề cốt truyện được lấp đầy với giá trị thay vì tên biến).

  2. Tôi cũng muốn tự động hóa chức năng hơn nữa, để tôi có thể chỉ cần đặt tập dữ liệu và ID, sau đó có chức năng lặp lại cho mỗi biến trong tập dữ liệu. Rõ ràng điều này yêu cầu giải quyết câu hỏi 1 trước, nếu không cả tên sách và tên tệp sẽ gặp phải sự cố .

Trả lời

13

Câu trả lời chung là deparse(substitute(x)). Ví dụ.

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

Ở đây nó đang được sử dụng:

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

nào sản xuất:

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

Trong ví dụ cụ thể của bạn, mặc dù điều này sẽ không làm việc bởi vì bạn không muốn dat$x làm tiêu đề, bạn chỉ muốn x. Chúng ta có thể làm thao tác nhiều hơn một chút tuy nhiên:

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

nào cho fooPlot(dat$x, col = "red") cho:

second attempt

Lưu ý mã này làm cho một số giả định, rằng main không phải là một vector, rằng sẽ chỉ bao giờ được một $ trong đối tượng được chuyển tới lô (ví dụ: bạn không thể sử dụng danh sách lồng nhau ví dụ với mã ở trên).

+0

Cảm ơn bạn rất nhiều. Nó hoạt động thực sự tốt. Có ai có bất cứ đề nghị nào về cách làm 2 (câu hỏi 2, xem ở trên). Ví dụ, làm cho âm mưu foo chạy trong một chức năng khác "PlotALL" mà vượt qua tất cả các biến của một tập dữ liệu từng người một để foo lô? Điều này sẽ cho phép tôi viết ## PlotAll (id, mydata) và nhận tất cả các đồ thị được in. Rất cám ơn –

1

Bạn cần truy xuất tập hợp các chuỗi, tên biến và sử dụng chúng cho tiêu đề của các ô và tên tệp của bạn.

Tôi sẽ sử dụng tập dữ liệu longley để minh họa cho mẹo.

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] 

Để vẽ mỗi biến, có hai bộ dây: tên biến và tên tập tin:

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 = "", vì nếu không nó đưa ra một ngớ ngẩn "Longley [[i]]" như y-label và nếu tôi sử dụng var.name [i] làm ylab, nó sẽ là thừa.

+0

Kính gửi p_barill, đó chính xác là những gì tôi cần. Cảm ơn rất nhiều vì sự giúp đỡ của bạn. –