दिलचस्प पोस्ट
एंड्रॉइड सेवा को हमेशा चलाने की जरूरत है (कभी भी रोकें या रोकें) क्या कोड साझा करने के लिए ड्रॉपबॉक्स का इस्तेमाल करते हुए एक नित्य गिट भंडार होस्ट करना संभव है? ज्ञात न्यूनतम और अधिकतम मूल्य के साथ संख्याओं की श्रेणी को कैसे स्केल किया जाए आईआईएस 7.5 पर एएसपी.नेट एमवीसी कई ग्राहक एक बंदरगाह पर एक साथ कनेक्ट करते हैं, 80 पर कहते हैं, सर्वर पर? इन अनुमतियों को क्यों अस्वीकार कर दिया जा रहा है? कैसे पता चलेगा कि कोई तारीख समय सी # में एक DateRange के बीच है इकाई फ़्रेमवर्क 4 सीटीपी 4 / सीटीपी 5 जेनेरिक रिपोजिटरी पैटर्न और यूनिट टेस्टेबल प्रपत्र प्रमाणीकरण समयबाह्य बनाम सत्रस्टेट टाइमआउट मैं जावा में एक 2 आयामी सरणी कैसे कॉपी करूं? अंडाकार के साथ एक स्ट्रिंग को छोटा करने के लिए आदर्श विधि मैं जे टाबबेडपैन टैब के आकार को कैसे बदल सकता हूं? पोस्ट सहित रेट्रोफ़िट 2.0 का उपयोग कर मल्टीपार्ट फॉर्म डेटा पोस्ट करें कस्टम कॉन्फ़िगरेशन फ़ाइल को सी # (फ्रेमवर्क 4.0) में पढ़ें आप jQuery में एक तत्व "फ्लैश" कैसे बनाते हैं

आर में एक अन्य समारोह के भीतर ggplot () का उपयोग करें

मैं ggplot2 लाइब्रेरी का उपयोग करके, एक सरल साजिश फ़ंक्शन लिखने की कोशिश कर रहा हूं। लेकिन ggplot को कॉल फंक्शन तर्क नहीं मिल रहा है।

माना जाता means कि एक data.frame पर विचार करें कि दो स्थितियों और दो मतलब मान जो कि मैं साजिश करना चाहता हूं (स्थिति एक्स अक्ष पर दिखाई देगी, इसका अर्थ वाई पर है)।

 library(ggplot2) m <- c(13.8, 14.8) cond <- c(1, 2) means <- data.frame(means=m, condition=cond) means # The output should be: # means condition # 1 13.8 1 # 2 14.8 2 testplot <- function(meansdf) { p <- ggplot(meansdf, aes(fill=meansdf$condition, y=meansdf$means, x = meansdf$condition)) p + geom_bar(position="dodge", stat="identity") } testplot(means) # This will output the following error: # Error in eval(expr, envir, enclos) : object 'meansdf' not found 

तो ऐसा लगता है कि ggplot eval बुला रहा है, जो तर्क meansdf नहीं मिल सकता है क्या किसी को पता है कि मैं ggplot को फ़ंक्शन तर्क को सफलतापूर्वक कैसे पारित कर सकता हूं?

(ध्यान दें: हां, मैं सीधे जीजीप्लोट फ़ंक्शन को सीधे कॉल कर सकता था, लेकिन अंत में मुझे उम्मीद है कि मेरा प्लॉट फंक्शन अधिक जटिल सामान बनाती है! :))

वेब के समाधान से एकत्रित समाधान "आर में एक अन्य समारोह के भीतर ggplot () का उपयोग करें"

जैसा कि जॉरीस और चेस ने पहले से ही सही उत्तर दिया है, मानक सर्वोत्तम अभ्यास केवल meansdf$ हिस्सा meansdf$ और सीधे डेटा फ्रेम कॉलम को देखें।

 testplot <- function(meansdf) { p <- ggplot(meansdf, aes(fill = condition, y = means, x = condition)) p + geom_bar(position = "dodge", stat = "identity") } 

यह काम करता है, क्योंकि aes में वर्णित वेरिएबल वैश्विक वातावरण में या ggplot को पास किए गए डेटा फ़्रेम में ggplot । यह भी यही कारण है कि आपका उदाहरण meansdf$condition का उपयोग कर meansdf$condition आदि – काम नहीं किया है: meansdf न ही वैश्विक वातावरण में उपलब्ध है, न ही यह meansdf को पास किए गए डेटा फ़्रेम के अंदर उपलब्ध है, जो कि meansdf ही है


तथ्य यह है कि कॉलिंग पर्यावरण के बजाय वैरिएबल को वैश्विक परिवेश में देखा जाता है वास्तव में ggplot2 में एक ज्ञात बग है कि इस समय हाडले ने तय नहीं किया है। इससे समस्याएं हो सकती हैं, यदि कोई साजिश के लिए उपयोग किए जाने वाले डेटा को प्रभावित करने के लिए एक स्थानीय चर, कहना, scale का उपयोग करना चाहता है:

 testplot <- function(meansdf) { scale <- 0.5 p <- ggplot(meansdf, aes(fill = condition, y = means * scale, # does not work, since scale is not found x = condition)) p + geom_bar(position = "dodge", stat = "identity") } 

इस मामले के लिए एक बहुत ही अच्छा समाधान संदर्भित गीथहब मुद्दे में विंस्टन चांग द्वारा मुहैया कराया गया है: स्पष्ट रूप से ggplot को कॉल के दौरान मौजूदा वातावरण में environment पैरामीटर सेट करना। यहां बताया गया है कि उपरोक्त उदाहरण के लिए क्या होगा:

 testplot <- function(meansdf) { scale <- 0.5 p <- ggplot(meansdf, aes(fill = condition, y = means * scale, x = condition), environment = environment()) # This is the only line changed / added p + geom_bar(position = "dodge", stat = "identity") } ## Now, the following works testplot(means) 

मुझे नहीं लगता कि आपको अपने फ़ंक्शन कॉल में meansdf$ हिस्सा शामिल करना meansdf$ । यह मेरी मशीन पर काम करता है:

 meansdf <- data.frame(means = c(13.8, 14.8), condition = 1:2) testplot <- function(meansdf) { p <- ggplot(meansdf, aes(fill=condition, y=means, x = condition)) p + geom_bar(position="dodge", stat="identity") } testplot(meansdf) 

उत्पादन करना:

यहां छवि विवरण दर्ज करें

aes_string() का प्रयोग करने का "उचित" तरीका aes() बजाय aes_string() का उपयोग करना है और वस्तुओं के बजाए कॉलम के नामों को वर्णों के रूप में उपयोग करना है:

अधिक प्रोग्रामेटिक उपयोगों के लिए, उदाहरण के लिए यदि आप चाहते हैं कि उपयोगकर्ता विभिन्न सौंदर्यशास्त्रों के लिए स्तंभ नामों को तर्क के रूप में निर्दिष्ट करने में सक्षम हों, या यदि यह फ़ंक्शन किसी ऐसे पैकेज में जा रहा हो जिसे R CMD CHECK को परिभाषित किए बिना चर नामों के बिना चेतावनी के पास करना पड़ सकता है, तो आप aes_string() उपयोग करें, जिसमें वर्ण के रूप में आवश्यक है

 testplot <- function(meansdf, xvar = "condition", yvar = "means", fillvar = "condition") { p <- ggplot(meansdf, aes_string(x = xvar, y= yvar, fill = fillvar)) + geom_bar(position="dodge", stat="identity") } 

यहां एक साधारण चाल है जो मैं अपने फ़ंक्शन पर्यावरण (दूसरी पंक्ति) में मेरे चर को परिभाषित करने के लिए बहुत उपयोग करता हूं:

 FUN <- function(fun.data, fun.y) { fun.data$fun.y <- fun.data[, fun.y] ggplot(fun.data, aes(x, fun.y)) + geom_point() + scale_y_continuous(fun.y) } datas <- data.frame(x = rnorm(100, 0, 1), y = x + rnorm(100, 2, 2), z = x + rnorm(100, 5, 10)) FUN(datas, "y") FUN(datas, "z") 

नोट करें कि जब भिन्न-भिन्न चर या डेटा-सेट का उपयोग किया जाता है तो y-axis लेबल भी बदलता है।

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

 library(ggplot2) means <- data.frame(means=c(13.8,14.8),condition=1:2) testplot <- function(meansdf) { p <- ggplot(meansdf, aes(fill=condition, y=means, x = condition)) p + geom_bar(position="dodge", stat="identity") } 

संपादित करें:

अद्यतन: अन्य जवाब और ggplot2 पैकेज को अद्यतन करने के बाद , ऊपर दिए गए कोड काम करता है कारण, टिप्पणियों में बताया गया है कि जीजीप्लोट वैश्विक परिवेश में (जब डेटाफ्रेम विशेष रूप से मेंडफ $ …) या उल्लिखित वातावरण के रूप में जोड़ा जाता है, एईएस में चर के लिए दिखेगा।

इसके लिए, सुनिश्चित करें कि आप ggplot2 के नवीनतम संस्करण के साथ काम करते हैं।

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

 plotgraph function(df,df.x,df.y) { dummy.df <<- df dummy.x <<- df.x dummy.y <<- df.y p = ggplot(dummy.df,aes(x=dummy.x,y=dummy.y,.....) print(p) } 

तो मुख्य कोड में मैं फ़ंक्शन कॉल कर सकता हूं

 plotgraph(data,data$time,data$Y1) plotgraph(data,data$time,data$Y2) 

संक्षिप्त उत्तर: qplot का प्रयोग करें

लंबे उत्तर: संक्षेप में आप ऐसा कुछ चाहते हैं:

 my.barplot <- function(x=this.is.a.data.frame.typically) { # R code doing the magic comes here ... } 

लेकिन इसमें लचीलेपन की कमी है क्योंकि आपको कष्टप्रद आर स्कोप आईडीओसिनक्रैसिज़ से बचने के लिए लगातार कॉलम नामकरण करना चाहिए। बेशक अगले तर्क चरण है:

 my.barplot <- function(data=data.frame(), x=..., y....) { # R code doing something really really magical here ... } 

लेकिन फिर यह संदेहपूर्वक लग रहा है जैसे कि qplot () को कॉल करना सही है?

 qplot(data=my.data.frame, x=some.column, y=some.other column, geom="bar", stat="identity",...) 

बेशक अब आप बड़े पैमाने पर खिताब की तरह चीजें बदलना चाहते हैं, लेकिन इसके लिए एक समारोह आसान हो जाता है … अच्छी खबर यह है कि स्क्रॉपिंग के मुद्दे ज्यादातर चले गए हैं

 my.plot <- qplot(data=my.data.frame, x=some.column, y=some.other column,...) set.scales(p, xscale=scale_X_continuous, xtitle=NULL, yscale=scale_y_continuous(), title=NULL) { return(p + xscale(title=xtitle) + yscale(title=ytitle)) } my.plot.prettier <- set.scale(my.plot, scale_x_discrete, 'Days', scale_y_discrete, 'Count') 

एईएस (…) को अपने फ़ंक्शन के एक चर के रूप में परिभाषित करना एक और वैकल्पिक हल है:

 func<-function(meansdf, aes(...)){} 

यह एक समान विषय पर मेरे लिए अभी ठीक काम किया है

मैं फ़ंक्शन के अंदर वांछित नामों के साथ नए डेटा फ़्रेम चर उत्पन्न करता हूं:

 testplot <- function(df, xVar, yVar, fillVar) { df$xVar = df[,which(names(df)==xVar)] df$yVar = df[,which(names(df)==yVar)] df$fillVar = df[,which(names(df)==fillVar)] p <- ggplot(df, aes(x=xvar, y=yvar, fill=fillvar)) + geom_bar(position="dodge", stat="identity") } 

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

myplot <- ggplot (……) + जो कुछ भी आप चाहते हैं वह प्रिंट (मायप्लॉट)

यह मेरे लिए एक ही समारोह में एक से अधिक समय के लिए काम किया