2012-05-20 20 views
7

मैं MNP पैकेज है जो मैं deparse के लिए एक दुर्भाग्यपूर्ण कॉल का पता लगाया गया है के साथ एक समस्या में चल रहा हूँ उपयोग करने के लिए (जिसका अधिकतम चौड़ाई 500 अक्षरों तक सीमित है)।एक पैकेज के समारोह जबरदस्ती उपयोगकर्ता द्वारा प्रदत्त समारोह

पृष्ठभूमि (आसानी से छोड़े जाने योग्य है, तो आप ऊब चुके हैं)

क्योंकि mnp कुछ हद तक एक विशेष स्वभाव का सिंटैक्स का उपयोग करता विकल्प सेट अलग (आप सूत्र परिभाषा cbind(choiceA,choiceB,...) शामिल हैं), मेरे सूत्र के बाएं हाथ की ओर के लिए अनुमति देने के लिए कॉल 1700 वर्ण या तो है जब model.matrix.defaultdeparse पर कॉल करता है। चूंकि deparse 500 अक्षरों की अधिकतम width.cutoff का समर्थन करता है, model.matrix.default में sapply(attr(t, "variables"), deparse, width.cutoff = 500)[-1L] लाइन इसके पहले तत्व के रूप में दिया गया है:

[1] "cbind(plan1, plan2, plan3, plan4, plan5, plan6, plan7, plan8, plan9, plan10, plan11, plan12, plan13, plan14, plan15, plan16, plan17, plan18, plan19, plan20, plan21, plan22, plan23, plan24, plan25, plan26, plan27, plan28, plan29, plan30, plan31, plan32, plan33, plan34, plan35, plan36, plan37, plan38, plan39, plan40, plan41, plan42, plan43, plan44, plan45, plan46, plan47, plan48, plan49, plan50, plan51, plan52, plan53, plan54, plan55, plan56, plan57, plan58, plan59, plan60, plan61, plan62, plan63, "  
[2] " plan64, plan65, plan66, plan67, plan68, plan69, plan70, plan71, plan72, plan73, plan74, plan75, plan76, plan77, plan78, plan79, plan80, plan81, plan82, plan83, plan84, plan85, plan86, plan87, plan88, plan89, plan90, plan91, plan92, plan93, plan94, plan95, plan96, plan97, plan98, plan99, plan100, plan101, plan102, plan103, plan104, plan105, plan106, plan107, plan108, plan109, plan110, plan111, plan112, plan113, plan114, plan115, plan116, plan117, plan118, plan119, plan120, plan121, plan122, plan123, " 
[3] " plan124, plan125, plan126, plan127, plan128, plan129, plan130, plan131, plan132, plan133, plan134, plan135, plan136, plan137, plan138, plan139, plan140, plan141, plan142, plan143, plan144, plan145, plan146, plan147, plan148, plan149, plan150, plan151, plan152, plan153, plan154, plan155, plan156, plan157, plan158, plan159, plan160, plan161, plan162, plan163, plan164, plan165, plan166, plan167, plan168, plan169, plan170, plan171, plan172, plan173, plan174, plan175, plan176, plan177, plan178, plan179, " 
[4] " plan180, plan181, plan182, plan183, plan184, plan185, plan186, plan187, plan188, plan189, plan190, plan191, plan192, plan193, plan194, plan195, plan196, plan197, plan198, plan199, plan200, plan201, plan202, plan203, plan204, plan205, plan206, plan207, plan208, plan209, plan210, plan211, plan212, plan213, plan214, plan215, plan216, plan217, plan218, plan219, plan220, plan221, plan222, plan223, plan224, plan225, plan226, plan227, plan228, plan229, plan230, plan231, plan232, plan233, plan234, plan235, " 
[5] " plan236, plan237, plan238, plan239, plan240, plan241, plan242, plan243, plan244, plan245, plan246, plan247, plan248, plan249, plan250, plan251, plan252, plan253, plan254, plan255, plan256, plan257, plan258, plan259, plan260, plan261, plan262, plan263, plan264, plan265, plan266, plan267, plan268, plan269, plan270, plan271, plan272, plan273, plan274, plan275, plan276, plan277, plan278, plan279, plan280, plan281, plan282, plan283, plan284, plan285, plan286, plan287, plan288, plan289, plan290, plan291, " 
[6] " plan292, plan293, plan294, plan295, plan296, plan297, plan298, plan299, plan300, plan301, plan302, plan303, plan304, plan305, plan306, plan307, plan308, plan309, plan310, plan311, plan312, plan313)" 

data.frame में चर के खिलाफ model.matrix.default परीक्षण इस, यह एक त्रुटि देता है।

deparse <- function (expr, width.cutoff = 60L, backtick = mode(expr) %in% 
    c("call", "expression", "(", "function"), control = c("keepInteger", 
                 "showAttributes", "keepNA"), nlines = -1L) { 
    ret <- .Internal(deparse(expr, width.cutoff, backtick, .deparseOpts(control), nlines)) 
    paste0(ret,collapse="") 
    } 

हालांकि, जब मैं mnp फिर से चलाने के लिए और के माध्यम से कदम, इसके लिए एक ही त्रुटि देता है:

समस्या

इस के आसपास पाने के लिए, मैं एक नया deparse समारोह लिखा है वही कारण (base::deparse चलाया जा रहा है, न कि मेरे deparse)।

यह मेरे लिए कुछ आश्चर्य की बात है, के रूप में क्या मैं और अधिक इस उदाहरण है, जहां उपयोगकर्ता परिभाषित समारोह अस्थायी रूप से आधार समारोह की-लिखते typified है उम्मीद:

> print <- function() { 
+ cat("user-defined print ran\n") 
+ } 
> print() 
user-defined print ran 

मैं हल करने के लिए सही तरीके से एहसास यह समस्या model.matrix.default को फिर से लिखना है, लेकिन डिबगिंग के लिए एक उपकरण के रूप में मैं उत्सुक हूं कि इसे अपने deparse का उपयोग करने के लिए मजबूर कैसे करें और क्यों अनुमानित (मेरे द्वारा) व्यवहार यहां नहीं हो रहा है।

उत्तर

4

फ़ंक्शन fixInNamespace और assignInNamespace मौजूदा कार्यों के संपादन की अनुमति देने के लिए प्रदान किए जाते हैं। तुम कोशिश कर सकते हो ...

assignInNamespace("deparse", 
        function (expr, width.cutoff = 60L, backtick = mode(expr) %in% 
       c("call", "expression", "(", "function"), control = c("keepInteger", 
       "showAttributes", "keepNA"), nlines = -1L) { 
    ret <- .Internal(deparse(expr, width.cutoff, backtick, .deparseOpts(control), nlines)) 
    paste0(ret,collapse="") 
         } , "base") 

मदद पृष्ठ पर एक संकेत है कि इस तरह के कार्यों के उपयोग के प्रतिबंध है और मुझे आश्चर्य इस तरह के मुख्य कार्य अतिरिक्त हो सकता है नहीं होगा नहीं है: लेकिन मैं नहीं के बाद से deparse के साथ mucking जाएगा बहुत खतरनाक लग रहा है सुरक्षा की परतें। चूंकि यह दुष्प्रभाव के माध्यम से काम करता है, इसलिए आपको परिणाम असाइन करने की आवश्यकता नहीं है।

+0

'फिक्सइन नामस्थान' में एक और सावधानी दी गई है: "वे [दस्तावेज कार्य] का उत्पादन कोड में उपयोग नहीं किया जाना चाहिए।" –

+0

मुझे @ gsk3 के प्रयासों से यह विचार आया कि यह "प्रयोगात्मक" उद्देश्यों के लिए था। –

+0

धन्यवाद, और चेतावनियों को ध्यान से नोट किया गया। मैं संभवतः उस कार्य को बदल दूंगा जो 'विचलन' के बजाय 'पतरस' कहलाता है। –

3

यह Writing R Extensions

नेमस्पेस के Section 1.6, Package Namespaces में वर्णित के रूप नामस्थान के साथ संकुल, कार्यों के लिए खोज कैसे एक बार उनके लोड कर रहे हैं सील कर रहे हैं। सीलिंग का मतलब है कि आयात और निर्यात को बदला नहीं जा सकता है और आंतरिक परिवर्तनीय बाइंडिंग को बदला नहीं जा सकता है। सीलिंग नामस्थान तंत्र के लिए एक सरल कार्यान्वयन रणनीति की अनुमति देता है। सीलिंग कोड विश्लेषण और संकलन उपकरण को फ़ंक्शन बॉडी में वैश्विक चर संदर्भ में की परिभाषा को सटीक रूप से पहचानने की अनुमति देता है।

नामस्थान पैकेज में फ़ंक्शंस द्वारा उपयोग किए जाने वाले चर के लिए खोज रणनीति को नियंत्रित करता है। यदि स्थानीय रूप से नहीं मिलता है, तो आर पैकेज को नामस्थान पहले खोजता है, फिर आयात, फिर बेस नेमस्पेस और फिर सामान्य खोज पथ खोजता है।

+0

मुझे लगता है कि ऐसा कुछ चल रहा था, इसलिए आपने समस्या को ठहराया है। अब ओवरराइड कैसे करें? :-) –

+0

@ gsk3: आपको 'डिपरसे' ओवरराइड करके कुछ तोड़ने की संभावना है, इसलिए मैं आपको सुझाव दूंगा कि आपको 'डिपार्स' कॉल का सही स्थान मिलना है, जिसे आप बदलना चाहते हैं, उस कॉल से ठीक पहले अपना फ़ंक्शन डालें और पुनर्स्थापित करें मूल के बाद तुरंत 'deparse'। आप उस फ़ंक्शन को बदलने के लिए 'fixInNamespace' का उपयोग करने में सक्षम हो सकते हैं जिसमें' डिपार्स 'कॉल शामिल है जिसे आप बदलना चाहते हैं। –