2011-11-21 11 views
16

क्या आउटपुट करने का कोई तरीका है उदा। list() का उपयोग किए बिना 2 ऑब्जेक्ट्स?एकाधिक आउटपुट वाले फ़ंक्शन से कैसे असाइन करें?

my.fun=function(vector, index) 
     { 
     a=fun.a(vector, index) 
     b=fun.b(vector, index) 
     output=list(a,b) 
     } 

या वस्तुओं की 2 सूचियों को आउटपुट करने के लिए? ध्यान में रखते हुए मैं भी हो सकता था:

 c=fun.a(vector, index) 
     d=fun.b(vector, index) 

और list(a,b) और एक ही समारोह के लिए एक और list(c,d) चाहता था।

यह जो कुछ मैं ढूंढ रहा हूं उसके लिए यह एक छोटा सा उदाहरण है, मेरा कार्य बड़ी वस्तुओं पर लागू होता है और मैं उन्हें एक सूची के रूप में निर्यात करता हूं, हालांकि मैं एक इंटरमीडिएट गणना भी निर्यात करना चाहता हूं। एक विकल्प सभी को एक ही सूची में विलय करना होगा, लेकिन मैं जानना चाहता हूं कि इसका कोई और समाधान है या नहीं।

+1

यह निर्णय लिया गया है कि यह एक डुप्लिकेट प्रश्न 1 वर्ष के बाद यह कहा गया था? –

+1

आपको इसे व्यक्तिगत रूप से लेने की आवश्यकता नहीं है, स्टैक ओवरफ्लो में कई डुप्लीकेट हैं और डुप्लिकेट को बंद करने और चिह्नित करने से साइट क्लीनर को और संबंधित प्रश्नों के संदर्भ में मदद मिलती है। चूंकि कई डुप्लिकेट हैं और उनमें से सभी की समीक्षा में काफी समय लग सकता है, यह हमेशा बंद नहीं होता है। – MByD

+1

फीसबैक @BinyaminSharet –

उत्तर

6

मैं के लिए आप क्या कर रहे हैं का वर्णन list2env आदर्श पाया; trickiest सा, मेरे लिए, बाहर काम कर रहा था क्या env पैरामीटर के लिए देने के लिए:

f=function(){ 
    list(a=1,b="my string") 
} 

ret=f() 
list2env(ret,env=environment()) 
#a=ret$a;b=ret$b #Same as previous line 

print(a);print(b) #1 and "my string" 
+0

आप 'पर्यावरण()' का उपयोग करना चाहते हैं या नहीं। यह इस मामले में वैश्विक पर्यावरण लौटाता है, लेकिन केवल इसलिए कि यह वर्तमान मूल्यांकन वातावरण है। –

+0

@JoshuaUlrich ने जो लिखा है, उसका विस्तार करने के लिए, पर्यावरण() आपको वर्तमान दायरा देता है (यानी जहां आपके स्थानीय चर संग्रहीत किए जा रहे हैं)। यह SO उत्तर था जिसने मुझे अंत में सबसे अधिक मदद की: http://stackoverflow.com/a/8773047/841830 –

3

मेरा मानना ​​है कि आप सूची का उपयोग करने के लिए सीमित हैं, लेकिन आप उन्हें पसंद गठजोड़ कर सकते हैं:

> list(list(a=1, b=2), list(c=3, d=4)) 
[[1]] 
[[1]]$a 
[1] 1 

[[1]]$b 
[1] 2 


[[2]] 
[[2]]$c 
[1] 3 

[[2]]$d 
[1] 4 
3

वापसी() वस्तु एक बात ... किसी सूची या एक सदिश की जरूरत है। आप "पुश" वैश्विक (या अन्य पर्यावरण) में कुछ और आप उपयोग कर सकते हैं करना चाहते हैं "< < -" या eval की तरह कुछ (..., माहौल = .GlobalEnv)

9

आप कर सकते हैं में केवल return एक वस्तु एक समारोह। लेकिन आपके पास कुछ अन्य विकल्प हैं। आप वैश्विक वातावरण में मध्यवर्ती वस्तुओं को असाइन कर सकते हैं (आपको कुछ भी ओवरराइट न करने के लिए सावधान रहना होगा) या आप अपने फ़ंक्शन में पर्यावरण पारित कर सकते हैं और ऑब्जेक्ट असाइन कर सकते हैं।

यहाँ उत्तरार्द्ध सुझाव का एक उदाहरण है:

fun <- function(x, env) { 
    env$x2 <- x^2 
    x^3 
} 
set.seed(21) 
x <- rnorm(10) 
myEnv <- new.env() 
fun(x, myEnv) 
# [1] 4.987021e-01 1.424421e-01 5.324742e+00 -2.054855e+00 1.061014e+01 
# [6] 8.125632e-02 -3.871369e+00 -8.171530e-01 2.559674e-04 -1.370917e-08 
myEnv$x2 
# [1] 6.288699e-01 2.727464e-01 3.049292e+00 1.616296e+00 4.828521e+00 
# [6] 1.876023e-01 2.465527e+00 8.740486e-01 4.031405e-03 5.728058e-06 
+0

+1 के लिए धन्यवाद, पहले मैंने सोचा, "अरे वह मेरा जवाब था" और फिर एहसास हुआ कि आपका संस्करण मेरे से कहीं अधिक संरचित और अच्छी तरह से सोचा गया था। –

+0

@DWin: हाँ, मैंने आपका जवाब देखा था, जबकि मैं अपना लेखन कर रहा था और बहस करता था कि पोस्ट करना है या नहीं (क्योंकि वे समान हैं)। लेकिन फिर मैंने सोचा कि किसी के लिए एक ही तरीके से समझाया जा सकता है। –

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