सूची के रूप में सभी पैरामीटर प्राप्त करें


80

क्या R सभी फ़ंक्शन तर्क प्राप्त करने के लिए एक ऑब्जेक्ट / फ़ंक्शन / विधि / कीवर्ड प्रदान करता है?

एक उदाहरण का उपयोग करना: function(a, b="default", ...)प्रदान करेगा aऔर bसाथ ही ...फ़ंक्शन वातावरण में भी। वहाँ एक बयान के समान है list(...)कि भी शामिल होगा aऔर bपरिणाम में?

या अभी तक एक और तरीका: एक आशुलिपि के लिए list(a=a, b=b, ...), दियाfunction(a, b, ...)


1
इस प्रश्न की समस्या यह है कि यह स्पष्ट नहीं है कि आप क्या पूछ रहे हैं। क्या आप पूछ रहे हैं कि 1 कैसे प्राप्त करें) जिन मूल्यों के साथ फ़ंक्शन को बुलाया गया था; 2) जिन अभिव्यक्तियों के साथ फ़ंक्शन को बुलाया गया था; 3) फ़ंक्शन परिभाषा में डिफ़ॉल्ट मान ? यह आपके प्रश्न से बिल्कुल स्पष्ट नहीं है, इसलिए आपको इन सभी 3 विकल्पों में से 3 अलग-अलग प्रकार के उत्तर मिले।
टीएमएस

जवाबों:


67

मुझे लगता है कि आप चाहते हैं match.call:

tmpfun <- function(a,b,...) {
print(as.list(match.call()))
print(as.list(match.call(expand.dots=FALSE)))
}
> tmpfun(a=1, b=2, c=3, d=4)
[[1]]
tmpfun

$a
[1] 1

$b
[1] 2

$c
[1] 3

$d
[1] 4

[[1]]
tmpfun

$a
[1] 1

$b
[1] 2

$...
$...$c
[1] 3

$...$d
[1] 4

23
यह विफल हो जाता है यदि फ़ंक्शन कॉल में चूक को ओवरराइड नहीं किया जाता है। यह डिफ़ॉल्ट सेट के साथ तर्क को सूचीबद्ध नहीं करेगा लेकिन ओवरराइड नहीं किया जाएगा।

क्या आप ऐसे पैकेज के बारे में जानते हैं जो इस तरह के फ़ंक्शन (केवल ...पैरामीटर के साथ) निर्यात करता है ?
krlmlr

5
यह तब काम नहीं करता जब tmpfun को दूसरे रैपर फ़ंक्शन से तर्क मिले। (सूची में केवल गैर-मूल्यांकन किए गए तर्क हैं)
रॉकसाइंस

1
इन कारणों के लिए, स्वीकृत उत्तर @ user399470 में से एक होना चाहिए जो उपयोग करता है c(as.list(environment()), list(...))जो दोनों डिफ़ॉल्ट आर्गन्स की आपूर्ति करता है और आर्ग्स की आपूर्ति करता है।
लॉरेंज वाल्थरट

77

एक समाधान का उपयोग करना है:

tempf <- function(a, b = 2, ...) {
    argg <- c(as.list(environment()), list(...))
    print(argg)
}
tempf(1, c = 3)
$a
[1] 1

$b
[1] 2

$c
[1] 3

यह तर्क मूल्यों की एक नामित सूची बनाता है।


क्या आप ऐसे पैकेज के बारे में जानते हैं जो इस तरह के फ़ंक्शन (केवल ...पैरामीटर के साथ) निर्यात करता है ?
krlmlr

2
या बस प्रिंट (as.list (पर्यावरण))) यदि आपके पास नहीं है ... तर्क के रूप में
RockScience

3
यह महान काम करता है, यह स्वीकार किए गए उत्तर पर लाभ है कि यह फ़ंक्शन को दिए गए मानों को कैप्चर करता है, न कि उन भावों के बजाय जिनका उपयोग मूल्यों की गणना करने के लिए किया जा सकता है। यदि आप आर्ग को बचाने की कोशिश कर रहे हैं तो आप बाद में फ़ंक्शन को कॉल कर सकते हैं, आप शायद मान चाहते हैं।
केन विलियम्स

1
यह इंगित करने के लायक हो सकता है कि आमतौर पर argg <- c(as.list(environment()), list(...))आपके फ़ंक्शन की शुरुआत में चलकर तर्कों को "कैप्चर" करना महत्वपूर्ण है । अन्यथा, environment()अन्य चरों को शामिल किया जाएगा जो कि भीतर बनाए गए हैंtempf()
mkirzon

12

argsफ़ंक्शन का प्रयास करें

meanफ़ंक्शन के लिए तर्क क्या हैं ?

> args(mean)
function (x, ...) 
NULL

lmफ़ंक्शन के बारे में क्या ?

    > args(lm)
function (formula, data, subset, weights, na.action, method = "qr", 
    model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, 
    contrasts = NULL, offset, ...) 
NULL

यदि आप तर्कों की एक सूची प्राप्त करना चाहते हैं तो प्रयास करें

as.list(args(lm))

यह खराब है और अधिक कार्य इस तरह के पूर्वानुमान के रूप में आर्ग्स कॉल के साथ सहयोग नहीं करते हैं। तो याद रखें कि एक पैरामीटर / ध्वज जिसे आप याद करने की कोशिश कर रहे थे, उसे याद रखने के लिए कहीं और जाना होगा।
जुप

9

संबंधित चीज़ की खोज करते समय इस सवाल पर ठोकर खाई। जब मुझे पता चलता है कि यह कई साल पुराना है, तो प्रतिक्रियाएं असंतोषजनक लगती हैं, और प्रश्न का कोई भी समाधान नहीं दिखता है।

formalsऔर environmentफ़ंक्शन के संयोजन का उपयोग करके, एक (अयोग्य) वर्कअराउंड बनाना संभव है । नीचे दिया गया उदाहरण, फॉर्मल्स से निकाले गए नामों का उपयोग करके पर्यावरण से तर्क निकालता है, फिर दीर्घवृत्त-सूची को जोड़ता है। यदि आप फ़ंक्शन कॉल के समय मानों को निर्धारित करना चाहते हैं, तो TRUE के तर्क_ तर्क को सेट करें। फ़ंक्शन में केवल फ़ंक्शन कॉल पर निहित या स्पष्ट रूप से सेट किए गए चर शामिल हैं।

allargs <- function(orig_values = FALSE) {
  # get formals for parent function
  parent_formals <- formals(sys.function(sys.parent(n = 1)))

  # Get names of implied arguments
  fnames <- names(parent_formals)

  # Remove '...' from list of parameter names if it exists
  fnames <- fnames[-which(fnames == '...')]

  # Get currently set values for named variables in the parent frame
  args <- evalq(as.list(environment()), envir = parent.frame())

  # Get the list of variables defined in '...'
  args <- c(args[fnames], evalq(list(...), envir = parent.frame()))


  if(orig_values) {
    # get default values
    defargs <- as.list(parent_formals)
    defargs <- defargs[unlist(lapply(defargs, FUN = function(x) class(x) != "name"))]
    args[names(defargs)] <- defargs
    setargs <- evalq(as.list(match.call())[-1], envir = parent.frame())
    args[names(setargs)] <- setargs
  }
  return(args)
}


tempf <- function(a, b = 2, ...) {
  d <- 5
  b <- 3

  cat("Currently set values defined in call or formals\n")
  print(allargs())
  cat("Values as defined at the time of the call\n")
  print(allargs(T))
}

tempf(1, c = 3)

Currently set values defined in call or formals
$a
[1] 1

$b
[1] 3

$c
[1] 3

Values as defined at the time of the call
$a
[1] 1

$b
[1] 2

$c
[1] 3

6

मेरा मानना ​​है कि आप देख रहे हैं formals:

formals(sd)
$x


$na.rm
[1] FALSE

और dputइस पर प्रयोग करने से आपको प्रश्न में निर्दिष्ट रूप दिया जाता है:

dput(formals(sd))
list(x = , na.rm = FALSE)

ध्यान दें कि आदिम कार्यों के formalsलिए काम नहीं करता है , केवल बंद हो जाता है।


2
यह केवल डिफ़ॉल्ट तर्कों को सूचीबद्ध करता है।
रॉकसाइंस

1
test <- function(
  x = 1,
  y = 2,
  ...
) {
  if(length(list(...)) == 0) {
    print(as.list(environment()))
  } else {
    print(c(as.list(environment()), list(...)))
  }
}

test()
test(z = 3)

3
पहले से प्रस्तावित समाधानों पर इस पद्धति का उपयोग करने से क्या लाभ होगा? विशेष रूप से, यह user399470 के उत्तर के समान प्रतीत होता है
मैट

1

rlang::fn_fmls एक संक्षिप्त और साफ समाधान देता है:

library(ggplot2)
library(rlang)

# action
argument_list <- rlang::fn_fmls(fn = geom_point)

# evaluate output
class(argument_list)
#> [1] "pairlist"

is.list(argument_list)
#> [1] TRUE

argument_list
#> $mapping
#> NULL
#> 
#> $data
#> NULL
#> 
#> $stat
#> [1] "identity"
#> 
#> $position
#> [1] "identity"
#> 
#> $...
#> 
#> 
#> $na.rm
#> [1] FALSE
#> 
#> $show.legend
#> [1] NA
#> 
#> $inherit.aes
#> [1] TRUE

2020-02-25 को रेप्रेक्स पैकेज (v0.3.0) द्वारा बनाया गया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.