में फ़ंक्शंस की एक नई श्रेणी को परिभाषित करना, इसलिए मैं वर्णन कार्यों को जोड़ने के लिए आर में निर्माण कर रहे कुछ कार्यों की कक्षा बदल रहा हूं और क्योंकि मैं अपने लिए सबकुछ संभालने के लिए एस 3 जेनिक्स का उपयोग करना चाहता हूं। असल में, मैंआर
foo <- function(x) x + 1
addFunction <- function(f, description) {
class(f) <- c("addFunction", "function")
attr(f, "description") <- description
f
}
foo <- addFunction(foo, "Add one")
की तरह एक संरचना है और फिर मैं की तरह
description <- function(x) UseMethod("description")
description.default <- function(x) deparse(substitute(x))
description.addFunction <- function(x) attr(x, "description")
यह ठीक काम करता है सामान करते हैं, लेकिन यह है कि सुरुचिपूर्ण नहीं है। मैं सोच रहा हूं कि कार्यों की एक नई श्रेणी को परिभाषित करना संभव है जैसे कि इस वर्ग के उदाहरणों को function
वाक्यविन्यास के समान वाक्यविन्यास में परिभाषित किया जा सकता है। दूसरे शब्दों में, इसे परिभाषित करने की addFunction
ऐसी है कि foo
निम्नलिखित तरीके से उत्पन्न होता है संभव है:
foo <- addFunction(description = "Add one", x) {
x + 1
}
(या कुछ इसी तरह, मैं कहाँ विशेषता समारोह में जोड़ा जाना चाहिए के बारे में कोई मजबूत भावनाओं है)?
पढ़ने के लिए धन्यवाद!
अद्यतन: मैं थोड़ा विचार के साथ अधिक प्रयोग किया, लेकिन वास्तव में अभी तक कोई ठोस परिणाम तक नहीं पहुंचे हैं - तो यह सिर्फ मेरे वर्तमान (अद्यतन) इस विषय पर विचार के एक सिंहावलोकन है:
मैंने function()
-फंक्शन की प्रतिलिपि बनाने के विचार की कोशिश की, इसे एक अलग नाम दिया और फिर इसे बाद में जोड़ दिया। बहरहाल, यह काम नहीं करता है और मैं यहाँ क्या हो रहा है पर किसी भी जानकारी के प्यार होता:
> function2 <- `function`
> identical(`function`, function2)
[1] TRUE
> function(x) x
function(x) x
> function2(x) x
Error: unexpected symbol in "function2(x) x"
> function2(x)
Error: incorrect number of arguments to "function"
function()
के रूप में, एक आदिम समारोह है मैं और अधिक सुराग के लिए यह परिभाषित करने सी-कोड को देखकर की कोशिश की। मैं विशेष रूप से function2(x)
कॉल से त्रुटि संदेश से चिंतित था। सी-कोड अंतर्निहित function()
/* Declared with a variable number of args in names.c */
SEXP attribute_hidden do_function(SEXP call, SEXP op, SEXP args, SEXP rho)
{
SEXP rval, srcref;
if (TYPEOF(op) == PROMSXP) {
op = forcePromise(op);
SET_NAMED(op, 2);
}
if (length(args) < 2) WrongArgCount("function");
CheckFormals(CAR(args));
rval = mkCLOSXP(CAR(args), CADR(args), rho);
srcref = CADDR(args);
if (!isNull(srcref)) setAttrib(rval, R_SrcrefSymbol, srcref);
return rval;
}
है और इस से, मैं निष्कर्ष है कि किसी कारण से, चार तर्क call
, op
, args
और rho
कम से कम दो अब आवश्यक हैं। do_function()
के हस्ताक्षर से मैं अनुमान लगा रहा हूं कि चार तर्क do_function
को पारित किया जाना चाहिए, एक वादा, तर्कों की एक सूची और फिर एक पर्यावरण होना चाहिए। मैं (शून्य पर इन तर्कों के दो करने के लिए सेट करने सहित) function2
के लिए विभिन्न संयोजनों का एक बहुत कोशिश की, लेकिन मैं एक ही (नया) त्रुटि संदेश प्राप्त हो:
> function2(call("sum", 2, 1), NULL, list(x=NULL), baseenv())
Error: invalid formal argument list for "function"
> function2(call("sum", 2, 1), NULL, list(x=NULL), NULL)
Error: invalid formal argument list for "function"
यह त्रुटि संदेश सी से दिया जाता है समारोह CheckFormals()
, जो मैं भी ऊपर देखा:
/* used in coerce.c */
void attribute_hidden CheckFormals(SEXP ls)
{
if (isList(ls)) {
for (; ls != R_NilValue; ls = CDR(ls))
if (TYPEOF(TAG(ls)) != SYMSXP)
goto err;
return;
}
err:
error(_("invalid formal argument list for \"function\""));
}
मैं नहीं धाराप्रवाह सी में सब पर तो यहां से पर मैं काफी आगे क्या करना है यकीन नहीं है हूँ,।
तो ये मेरी अद्यतन प्रश्न हैं:
- क्यों
function
औरfunction2
उसी तरह से व्यवहार नहीं करते? क्या मुझेfunction2
पर एक अलग वाक्यविन्यास का उपयोग करने की आवश्यकता है जब वे आर में समान समझा जाता है? function2
के उचित तर्क क्या हैंfunction2([arguments])
वास्तव में एक फ़ंक्शन परिभाषित करेगा?
मुझे नहीं लगता कि आप यह वास्तव में उस तरह से कर सकते हैं करते हैं:
अपने वर्तमान समस्या के लिए यहां एक ही समाधान है। आप 'addFunction (वर्णन = "एक जोड़ें", x)' और फ़ंक्शन बॉडी के बीच एक इंफिक्स ऑपरेटर का उपयोग कर सकते हैं। इन्फिक्स ऑपरेटर तब 'बॉडी <-'' कॉल करेगा। लेकिन मैं शायद एक कन्स्ट्रक्टर फ़ंक्शन को परिभाषित करता हूं जिसमें फ़ंक्शन तर्क और शरीर पैरामीटर के रूप में होता है। – Roland
एक संभावित रूप से अधिक आर-आईश तरीका "विवरण <-" फ़ंक्शंस बनाना होगा, और फिर 'foo = function (x) {x * 2} करें; विवरण (एक्स) = "दोगुनी" ' – Spacedman
धन्यवाद आप लोग :) कार्यक्षमता के मामले में दोनों निश्चित रूप से अच्छे समाधान हैं। लेकिन एक जिद्दी दृष्टिकोण से, मैं वास्तव में इसे फ़ंक्शन परिभाषा की तरह करना चाहूंगा। किसी ने मुझे एक बार कहा था कि आर वास्तव में सूचियों और कार्यों के अलावा कुछ भी नहीं है, लेकिन जाहिर है, यह वास्तव में सच नहीं है ... – AHP