2012-03-12 13 views
9

प्लॉट करने के लिए पास वैरिएबल नाम मैं सोच रहा था कि कोई भी फ़ंक्शन के भीतर एक चर नाम का उपयोग करने में मेरी सहायता कर सकता है। मैंने एक डॉट प्लॉट को एक साथ रखा है जो चर का प्रकार बनाता है और फिर बिटमैप उत्पन्न करता है, लेकिन plot शीर्षक पर वेरिएबल नाम पास करने के लिए मुझे R नहीं मिल सकता है।फ़ंक्शन शीर्षक

उदाहरण डेटा

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. समारोह की दूसरी पंक्ति में, मैं

    `if (is.null(Title)) {Title=varname(x)} else {Title=Title}` 
    
    ताकि मैं डॉन '

    की तरह कुछ चर नाम पर पारित करने के लिए चाहते हैं, टी को फ़ंक्शन में "रक्त" डालना होगा शीर्षक फ़ील्ड (उदाहरण के लिए डिप्लोटर (mydata $ id, mydata $ blood)

    असल में, एक फ़ंक्शन में चर नाम में पेस्ट कैसे करता है? बेहतर होगा यदि कोई शीर्षक से डेटासेट नाम ले सकता है (डेटासेट को अटैच किए बिना, जिसे मुझे बताया गया है, अभ्यास खराब है), ताकि mydata$blood प्राप्त करने के बजाय, आपको बस "रक्त" शीर्षक में

    मैं में एक चर नाम में पेस्ट करने के लिए एक आसान समाधान खोजने में विफल रहा हूं। जैसा कि आप अनुमान लगा सकते हैं, paste() फ़ंक्शन में वेरिएबल नाम डालने से वेरिएबल के मान लौटाते हैं (ताकि प्लॉट शीर्षक वैल्यू नाम के बजाय मानों से भरा हो)।

  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, ऊपर देखें)। उदाहरण के लिए, फू प्लॉट को किसी अन्य फ़ंक्शन "प्लॉटॉल" के भीतर चलाएं जो एक डेटासेट के सभी चर को एक प्लॉट प्लॉट में पास करता है? यह मुझे ## PlotAll (id, mydata) लिखने और सभी ग्राफ़ मुद्रित करने की अनुमति देगा। बहुत धन्यवाद –

1

आपको स्ट्रिंग्स, वेरिएबल नामों का एक सेट पुनर्प्राप्त करने की आवश्यकता है, और अपने प्लॉट्स और फ़ाइल नामों के शीर्षक के लिए भी उनका उपयोग करें।

मैं चाल को चित्रित करने के लिए लम्बे डेटासेट का उपयोग करूंगा।

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] 

प्रत्येक चर प्लॉट करने के लिए तार के दो सेट मिलता है,: ", के बाद से अन्यथा यह एक मूर्खतापूर्ण देता है"

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 = "Longley [[मैं]]" के रूप में: चर नाम और फ़ाइल नाम वाई-लेबल, और यदि मैं var.name [i] ylab के रूप में उपयोग करता हूं, तो यह अनावश्यक होगा।

+0

प्रिय p_barill, यह वही है जो मुझे चाहिए। आपकी मदद के लिए बहुत बहुत धन्यवाद। –

संबंधित मुद्दे