2011-02-18 18 views
10

से एक नामित वेक्टर बनाने: समारोह के अंत मेंआर: एक समारोह मैं इस तरह अदिश चर का एक गुच्छा को परिभाषित अंदर चर

a <- 10 
b <- a*100 
c <- a + b 

, मैं एक वेक्टर नामित में a,b,c वापस जाने के लिए चाहते हैं, कम से कम कोडिंग के साथ चर के रूप में एक ही नाम, के साथ, यानी मैं नहीं क्या करना चाहते हैं:

c(a = a, b = b, c = c) 

वहाँ है कि इस करता है एक भाषा निर्माण है? उदाहरण के लिए, यदि मैं बस return(c(a,b,c)) करता हूं तो यह एक अनाम वेक्टर लौटाता है, जो मैं नहीं चाहता हूं।

> cbind(a,b,c)[1,] 
    a b c 
    10 1000 1010 

वहाँ शायद एक बेहतर है, कम hacky, रास्ता नहीं है: मैं वर्तमान में ऐसा करने का एक hacky रास्ता नहीं है?

+1

सी (ए = ए, बी = बी, सी = सी) से कम न्यूनतम क्या हो सकता है? आपको कहीं नाम और मूल्य निर्दिष्ट करना होगा। या क्या आप चाहते हैं कि यह जादुई रूप से महसूस करे कि 'ए' को 'ए' कहा जाता है? – Spacedman

+1

हां यही मैं चाहता हूं - उदा। उपरोक्त 'cbind' वह करता है, और मैं इसकी न्यूनतमता से काफी खुश हूं, लेकिन मुझे आश्चर्य हुआ कि क्या एक और अधिक सरल तरीका था। परिवर्तनीय नाम लंबे समय तक हो सकते हैं ... और मैं टाइपिंग पर सहेजना चाहता हूं :) –

+0

आप टाइपिंग पर सहेजना चाहते हैं, लेकिन आप अपना कोड अस्पष्ट करते हैं (यदि मुझे ऐसा निर्माण दिखाई देता है, तो मैं इसे कोड एप से बाहर निकालता हूं) और आप हार जाते हैं बड़े और/या कई वैक्टर से निपटने के दौरान काफी कुछ प्रदर्शन। मैं वास्तव में फिर से सोचूंगा कि क्या आपको किसी ऐसे तरीके का समाधान नहीं मिल रहा है जिसे अलग तरीके से हल किया जा सके। –

उत्तर

11

यहां आपके लिए ऐसा करने का एक फ़ंक्शन है, जो आपको वैकल्पिक रूप से कुछ मानों का नाम देने की अनुमति देता है। इस पर बहुत कुछ नहीं है, चाल को अनचाहे अभिव्यक्ति प्राप्त करने के अलावा और इसे एक वर्ण वेक्टर में छोड़ दें।

c2 <- function(...) { 
    vals <- c(...) 

    if (is.null(names(vals))) { 
    missing_names <- rep(TRUE, length(vals)) 
    } else { 
    missing_names <- names(vals) == "" 
    } 
    if (any(missing_names)) { 
    names <- vapply(substitute(list(...))[-1], deparse, character(1)) 
    names(vals)[missing_names] <- names[missing_names] 
    } 

    vals 
} 

a <- 1 
b <- 2 
c <- 3 

c2(a, b, d = c) 
# a b d 
# 1 2 3 

ध्यान दें कि यह वाक्य रचनात्मक रूप से मान्य नामों का उत्पादन करने की गारंटी नहीं है। यदि आप इसे चाहते हैं, तो फ़ंक्शन को names वेक्टर पर लागू करें।

c2(mean(a,b,c)) 
# mean(a, b, c) 
#   1 

इसके अलावा, विकल्प का उपयोग करता है किसी भी समारोह के साथ के रूप में, c2 से एक और समारोह के भीतर किया जाना करने के लिए इंटरेक्टिव उपयोग के लिए अधिक उपयुक्त है।

+0

@ हैडली: 'विकल्प (सूची (...)) [- 1]' विकल्प (...()) के साथ छोटा किया जा सकता है ' – Tommy

+0

छोटा, लेकिन और भी भ्रमित कर दिया! (मुझे एहसास है कि सूची का उपयोग नहीं किया जाता है, लेकिन यह इरादा बताता है) – hadley

+1

@ हैडली: मैंने दो कार्यों को 'एनसी' और' nlist' [my 'kimisc' पैकेज] में जोड़ा है (https://github.com/krlmlr/ किमस्क), आपको और यह जवाब जमा कर रहा है। – krlmlr

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