2016-08-11 3 views
6

मैं कुछ पार्स किए गए आर कोड में हेरफेर करने की कोशिश कर रहा हूं और = ऑपरेटर के साथ कठिनाई में भाग गया हूं। चूंकि यह स्निपेट दिखाता है, मैं एक ऑब्जेक्ट प्राप्त कर सकता हूं जो कहता है कि इसका प्रकार "भाषा" है, लेकिन फिर यह "है" परीक्षण पर झूठा रिटर्न देता है जो आर एस वर्ग के स्लॉट पर मान निर्दिष्ट करते समय उपयोग करता है।आर में पार्सिंग = ऑपरेटर भाषा ऑब्जेक्ट नहीं देता

parsed <- parse(text = "cylinders = c(4, 6, 8)") 
print (typeof(parsed)) # Prints "expression" 

langObj <- parsed[[1]] 
print (typeof(langObj)) # Prints "language" 
print (is(langObj, "language")) # Prints FALSE 

setClass("Foo", 
    slots = list(
    s1 = "language") 
) 

setMethod ("initialize", 
    "Foo", 
    function(.Object, obj){ 
    [email protected] <- obj 
    return (.Object) 
    } 
) 

new (Class = "Foo", langObj) 

यह अंतिम पंक्ति त्रुटि पैदा करता है: - ऑपरेटर = के स्थान पर प्रयोग किया जाता है, कोड अपेक्षित ढंग से काम करता है

Error in (function (cl, name, valueClass) : 
    assignment of an object of class “=” is not valid for @‘s1’ in an object of class “Foo”; is(value, "language") is not TRUE 

नोट यदि < कि

यहां कुछ नमूना कोड है ।

"टाइपोफ" और "है" के बीच क्या अंतर है? = ऑपरेटर "भाषा" मान क्यों नहीं देता है, जबकि < - करता है?

+2

के बजाय मेल खाता है, मुझे लगता है कि '= 'वैध भाषा वस्तु क्यों नहीं है (और इस प्रकार एक त्रुटि), लेकिन '<-' है, सहायता फ़ाइल'? "भाषा-वर्ग" में पाया जा सकता है, जो स्पष्ट रूप से 'भाषा' ऑब्जेक्ट्स को सूचीबद्ध करता है: '" (", " <- ", " कॉल " , "के लिए", "अगर", "दोहराने", "जबकि", "नाम", "{" '। – nrussell

+0

' is.language (langObj) का उपयोग करना 'सही प्रिंट होगा। हैं लक्ष्य एक अभिव्यक्ति है जिसे आप eval करने में सक्षम होना चाहते हैं यूट, आपको केवल 'langObj <- पार्सड' और 'सेट क्लास ("फू", स्लॉट = सूची (एस 1 = "अभिव्यक्ति") का उपयोग करके असाइन करना चाहिए)। –

उत्तर

2

आपको यह समझने की आवश्यकता है कि typeof काफी कम स्तर की विशेषता देता है और is(... , "language") कुछ हद तक अमूर्तता का परीक्षण करता है। typeof के लिए बहुत अधिक उपयोग नहीं है। यह एक वस्तु के वर्ग के लिए पूछने के लिए आम तौर पर और अधिक उपयोगी है:

> class(parsed) 
[1] "expression" 
> class(parsed[[1]]) 
[1] "=" 

यह दूसरा एक थोड़ा अजीब लग सकता है, और मैं इसे eitehr एक call या और Ops परिणाम माना होता, लेकिन अगर आप को देखो :

parsed[[1]] 
#cylinders = c(4, 6, 8) 

आप देख के रूप में है कि कॉल वस्तु आंतरिक रूप से प्रतिनिधित्व किया जाता है, पार्स पेड़ यानी:

`=`(cylinders, c(4, 6, 8)) 

... यह देखते हुए कि:

parsed[[1]][[1]] 
`=` # note the backticks signifying a function, a language object 

... और यह वास्तव में एक कॉल-वस्तु है कि:

is.call(parsed[[1]]) 
#[1] TRUE 

देखें ?parse जहां यह समझाया गया है समारोह एक unevaluated कॉल-ऑब्जेक्ट कि। मैं एक एस 3 लड़का से अधिक हूं इसलिए यह समझाने की कोशिश कर रहा हूं कि आपके एस 4 सामान के साथ क्या गलत हो रहा है, मेरे वेतन ग्रेड से ऊपर है। ध्यान दें कि आपके असफल एस 4 प्रयासों से त्रुटि संदेश 'वर्ग' के बजाय 'टाइपोफ़'

+0

ग्रेट स्पष्टीकरण। मेरा समाधान उपरोक्त एडवर्ड कार्नी द्वारा सुझाए गए अनुसार, पार्स किए गए ऑब्जेक्ट्स की बजाय अभिव्यक्ति ऑब्जेक्ट्स को स्टोर करना है। – Barbara

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