परीक्षण के उद्देश्य से, मैं एक नए प्रकार का असाइनमेंट ऑपरेटर रखना चाहता हूं, जैसे %<-%, जो असाइनमेंट निष्पादित करते समय फ़ाइल में मान सहेजता है। इसका मूल रूप से मतलब है कि मैं जांच सकता हूं कि किसी फ़ंक्शन के विभिन्न आमंत्रण समान मान लौटाते हैं या नहीं।

उदाहरण के लिए, यदि मैं answer %<-% 42 लिखता हूं, तो मुझे उम्मीद है कि 42 को ऑब्जेक्ट answer को सौंपा जाएगा, और साथ ही मेरी कार्य निर्देशिका में एक answer.rds बनाया जाएगा जिसके लिए readRDS('answer.rds') == 42.

मैंने substitute और अन्य उपयोगिताओं का उपयोग करने की कोशिश की, लेकिन पैरामीटर को ठीक से उद्धृत करने का तरीका नहीं मिला।

> `%<-%` <- function(name, value) {name <- value; dput(name)}
> answer %<-% 42
42
> `%<-%` <- function(name, value) {name <- value; dput(substitute(name))}
> answer %<-% 42
42
> `%<-%` <- function(name, value) {name <- value; dput(quote(name))}
> answer %<-% 42
name
2
nalzok 26 जुलाई 2019, 02:10

1 उत्तर

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

अमूल्यांकित अभिव्यक्ति को एक वर्ण स्ट्रिंग में बदलने के लिए आपको deparse(substitute(x)) का उपयोग करना चाहिए

आपके उदाहरण में ऐसा कुछ काम करना चाहिए:

`%<-%` <- function(name, value) {
  assign(deparse(substitute(name)), value, envir = .GlobalEnv)
  saveRDS(value, paste0(deparse(substitute(name)),'.rds'))
}
answer %<-% 1

answer
#[1] 1

readRDS('answer.rds')
#[1] 1

संपादित करें:

जैसा कि आप अपनी टिप्पणी में इंगित करते हैं, इस फ़ंक्शन के लिए वैश्विक परिवेश को हमेशा असाइन करने के बजाय inherits = T का उपयोग करना अधिक समझ में आता है, इसलिए:

`%<-%` <- function(name, value) {
  assign(deparse(substitute(name)), value, inherits = T)
  saveRDS(value, paste0(deparse(substitute(name)),'.rds'))
}
2
Chris 26 जुलाई 2019, 04:40