EDIT: हेडली विकम बताते हैं कि मुझे याद आती है। सीएमडी जांच चेतावनियों को नहीं बल्कि NOTES फेंक रहा है। मैं बहुत भ्रम के लिए माफी चाहता हूँ। यह मेरी देखरेख थी।
लघु संस्करण
R CMD check
इस नोट को हर बार जब मैं ggplot2 में समझदार कथानक-रचना वाक्य-विन्यास का उपयोग करता हूँ :
no visible binding for global variable [variable name]
मैं समझता हूं कि आर सीएमडी जांच क्यों करता है, लेकिन यह अन्यथा समझदार वाक्यविन्यास की पूरी नस को अपराधी बना देता है। मुझे यकीन नहीं है कि मेरे पैकेज को पास करने R CMD check
और सीआरएएन में भर्ती होने के लिए क्या कदम उठाना है।
पृष्ठ - भूमि
Sascha Epskamp ने पहले अनिवार्य रूप से एक ही मुद्दे पर पोस्ट किया था । मुझे लगता है कि अंतर यह है कि यहsubset()
मेन्यू कहता है कि यह इंटरैक्टिव उपयोग के लिए डिज़ाइन किया गया है ।
मेरे मामले में, मुद्दा खत्म नहीं हुआ है, subset()
बल्कि एक मुख्य विशेषता है ggplot2
: data =
दलील।
कोड का एक उदाहरण मैं लिखता हूं जो इन नोटों को उत्पन्न करता है
यहाँ मेरे पैकेज में एक उप-कार्य है जो एक प्लॉट में अंक जोड़ता है:
JitteredResponsesByContrast <- function (data) {
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
R CMD check
, इस कोड को पार्स करने पर, कहेगा
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'y.values'
क्यों आर सीएमडी जाँच सही है
जाँच तकनीकी रूप से सही है। x.values
तथाy.values
- फ़ंक्शन में स्थानीय रूप से परिभाषित नहीं किया गया है
JitteredResponsesByContrast()
x.values <- [something]
विश्व स्तर पर या कॉल करने वाले के रूप में पूर्व-परिभाषित नहीं हैं ।
इसके बजाय, वे एक डेटाफ्रेम के भीतर परिवर्तनशील होते हैं जो पहले परिभाषित हो जाते हैं और फ़ंक्शन में पारित हो जाते हैं JitteredResponsesByContrast()
।
क्यों ggplot2 R CMD जाँच की अपील करना मुश्किल बनाता है
ggplot2 एक data
तर्क के उपयोग को प्रोत्साहित करता है। डेटा तर्क, संभवतः, इस कोड को निष्पादित करेगा
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
लेकिन यह कोड ऑब्जेक्ट-नहीं-मिली त्रुटि का उत्पादन करेगा:
library(ggplot2)
hwy # a variable in the mpg dataset
दो काम-आस-पास, और मैं न तो क्यों खुश हूं
NULLING रणनीति
मैथ्यू डोले ने समस्याग्रस्त चरों को NULL को पहले सेट करने की सिफारिश की, जो मेरे मामले में इस तरह दिखेगी:
JitteredResponsesByContrast <- function (data) {
x.values <- y.values <- NULL # Setting the variables to NULL first
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
मैं इस समाधान की सराहना करता हूं, लेकिन मैं इसे तीन कारणों से नापसंद करता हूं।
- यह तुष्टिकरण से परे कोई अतिरिक्त उद्देश्य नहीं है
R CMD check
। - यह इरादे को नहीं दर्शाता है। यह इस उम्मीद को जगाता है कि
aes()
कॉल वास्तविक उद्देश्य को देखते हुए (अब आर सीएमडी जाँच को स्पष्ट रूप से पता नहीं चलेगा) - 1 और 2 की समस्याएं कई गुना बढ़ जाती हैं क्योंकि हर बार जब आप प्लॉट एलिमेंट रिटर्न करते हैं, तो आपको एक भ्रमित करने वाला नॉवेल स्टेटमेंट जोड़ना होगा।
() रणनीति के साथ
आप with()
स्पष्ट रूप से संकेत देने के लिए उपयोग कर सकते हैं कि विचाराधीन चर कुछ बड़े वातावरण में पाए जा सकते हैं। मेरे मामले में, with()
इस तरह दिखता है:
JitteredResponsesByContrast <- function (data) {
with(data, {
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
}
)
}
यह समाधान काम करता है। लेकिन, मुझे यह समाधान पसंद नहीं है क्योंकि यह उस तरीके से भी काम नहीं करता है जिससे मैं इसकी उम्मीद करूंगा। यदि with()
वास्तव में जहां चर हैं करने के लिए दुभाषिया ओर इशारा करते हुए की समस्या को हल कर रहे थे, तो मैं भी नहीं करना चाहिए की जरूरत हैdata =
तर्क। लेकिन, with()
इस तरह से काम नहीं करता है:
library(ggplot2)
p <- ggplot()
p <- p + with(mpg, geom_point(aes(x = hwy, y = cty)))
p # will generate an error saying `hwy` is not found
तो, फिर से, मुझे लगता है कि इस समाधान में NULLing रणनीति के समान दोष हैं:
- मुझे अभी भी हर प्लॉट एलिमेंट फ़ंक्शन के माध्यम से जाना है और
with()
कॉल में तर्क को लपेटना है with()
कॉल भ्रामक है। मुझे अभी भी एकdata =
तर्क की आपूर्ति करने की आवश्यकता है ; सभीwith()
खुश हैR CMD check
।
निष्कर्ष
जिस तरह से मैं इसे देखता हूं, तीन विकल्प हैं जो मैं ले सकता हूं:
- लॉबी CRAN नोटों की अनदेखी करके यह तर्क देते हैं कि वे " चतुर " ( CRAN नीति के अनुसार ) हैं, और हर बार जब मैं एक पैकेज जमा करता हूं
- दो अवांछनीय रणनीतियों (NULLing या
with()
ब्लॉक) में से एक के साथ मेरा कोड ठीक करें - हम वास्तव में जोर से और आशा है कि समस्या दूर हो जाती है
तीनों में से कोई भी मुझे खुश नहीं करता है, और मैं सोच रहा हूं कि लोग मुझे क्या सुझाव देते हैं (और ggplot2 में टैप करने के लिए अन्य पैकेज डेवलपर्स) को क्या करना चाहिए। सभी को अग्रिम धन्यवाद। मैं वास्तव में इस के माध्यम से भी अपने पढ़ने की सराहना :-)
aes_string
transform
और subset
100% यकीन नहीं है, लेकिन यह समझ में आता है) के साथ एक समस्या है ।