2013-03-20 20 views
6

मैंने How to take in text/character argument without quotes से पहले एक प्रश्न पूछा। परिदृश्य में मैंने उस प्रश्न में प्रदान किया है, तर्कों की संख्या तय की गई है, इसलिए फ़ंक्शन परिभाषा में उपयोग किए जाने वाले eval (substitute()) की संख्या मेरे पास तर्कों की संख्या से मेल खाती है।कई अभिव्यक्तियों पर eval (substitute()) का उपयोग करें

अब मैं एक परिदृश्य में जहाँ मैं एक तर्क है, उदाहरण के factors (नीचे देखें) के लिए है, और उपयोगकर्ता उनके आसपास उद्धरण का उपयोग किए बिना एक से अधिक स्तंभ नाम निर्दिष्ट कर सकते हैं - यानी, वे factor1 बजाय "factor1" का प्रयोग करेंगे। और मैं उपयोगकर्ता द्वारा प्रदान किए गए प्रत्येक कॉलम नाम का मूल्यांकन करना चाहता हूं।

foo<-function(data.frame, factors){ 

} 

प्रश्न 1: मुझे आश्चर्य है कि अगर वहाँ eval (स्थानापन्न()) कई भाव को लागू करने के लिए जब भाव की संख्या भिन्न हो सकते हैं एक तरीका है।

जैसा कि बताया गया है, eval (substitute()) संभावित रूप से खतरनाक हो सकता है और कुछ परिस्थितियों में विफल हो सकता है।

प्रश्न 2: तो वहाँ के रूप में नीचे दिखाया गया स्तंभ नाम उद्धृत का उपयोग कर के अलावा अन्य मुद्दे से निपटने के लिए एक और अधिक सुंदर तरीका है: इस उदाहरण में आपके द्वारा दिए गए

foo<-function(data.frame, factors){ 
    output<-data.frame[, factors] 
    output 
} 
foo(data.frame=dataset, factors=c("factor1", "factor2")) 

उत्तर

7

सबसे पहले, मैं निश्चित रूप से उद्धृत कॉलम नामों का उपयोग करना पसंद करूंगा।

XX <- c("cyl", "mpg") 
foo(mtcars, XX) 

जिसके अनुसार, मामले में आप गैर उद्धृत प्रतीकों में से एक सदिश में पारित करने के लिए चाहते हैं, तो यह आपके प्रश्न 2 पते: उनके पक्ष में एक बात यह है कि वे निम्नलिखित की तरह उपयोगी अविवेक की अनुमति देंगे है।

foo <- function(data, factors) { 
    jj <- as.character(substitute(factors)[-1]) 
    data[,jj] 
} 

head(foo(data = mtcars, factors = c(cyl, mpg))) 
#     cyl mpg 
# Mazda RX4   6 21.0 
# Mazda RX4 Wag  6 21.0 
# Datsun 710   4 22.8 
# Hornet 4 Drive  6 21.4 
# Hornet Sportabout 8 18.7 
# Valiant    6 18.1 
संबंधित मुद्दे