मेरे पास एक फ़ंक्शन है और मैं इस फ़ंक्शन के लिए फ़िल्टर पर लागू शर्तों को अनदेखा करना चाहता हूं जब संबंधित तर्क नहीं कहा जाता है।

उदाहरण:

dataset <- data.frame(a = c(1,2,3), b = c(4,5,6))

topcm <- function(data, feat1, feat2) {
  data %>% filter(a == feat1 & b == feat2) }

topcm(dataset, 2, 5) #should return only the second line of dataset

topcm(dataset, feat2 = 5) #I want it to return the second line as well, but it will instead give an error. I want it to still be able to filter, ignoring the conditional that isn't specified as an argument.

मुझे पता है कि मैं यह जांचने के लिए कुछ "अगर" लागू कर सकता हूं कि क्या तर्क मौजूद हैं और वहां से टूटते हैं या जारी रहते हैं, लेकिन अगर बहुत सारे तर्क हैं, तो मुझे इसे एक-एक करके करने की आवश्यकता होगी। क्या इसे करने का कोई आसान तरीका है?

0
daniellga 22 जुलाई 2019, 16:17

2 जवाब

सबसे बढ़िया उत्तर

आप इसे चर पर डिफ़ॉल्ट का उपयोग करके कर सकते हैं। उदाहरण के लिए,

topcm <- function(data, feat1 = data$a, feat2 = data$b) {
  data %>% filter(a %in% feat1 & b %in% feat2) }

विचार यह है: feat1 का डिफ़ॉल्ट मान अभिव्यक्ति data$a है, जो एक वेक्टर होगा जिसमें कॉलम a के सभी मान होंगे, जो भी डेटाफ्रेम data के रूप में पारित किया गया था। .

यदि आप feat1 के लिए कोई मान निर्दिष्ट नहीं करते हैं, तो डिफ़ॉल्ट का उपयोग किया जाएगा, और a %in% feat1 हमेशा TRUE रहेगा क्योंकि a और feat1 होंगे वही चीज।

यदि आप कोई मान निर्दिष्ट करते हैं, तो डिफ़ॉल्ट को अनदेखा कर दिया जाएगा, और परीक्षण केवल उन मानों के लिए TRUE होगा जिन्हें आप feat1 के रूप में पास करते हैं।

1
user2554330 22 जुलाई 2019, 17:17

एक आसान विकल्प ... को तर्क के रूप में रखना और अभिव्यक्ति को तर्क के रूप में पास करना है। अन्यथा, हमें is_missing maybe_missing के साथ मूल्यांकन करने की आवश्यकता हो सकती है और बहुत सारे तर्कों से निपटने के दौरान यह गड़बड़ हो सकता है

topcm <- function(data, ...) {
   data %>%
       filter(...) 


  }

topcm(dataset, a==2, b ==5) 
topcm(dataset, b == 5) 
0
akrun 22 जुलाई 2019, 16:35