是否有一种方便,可维护的方法从函数中获取实际参数列表?

时间:2016-09-10 14:29:28

标签: r introspection

假设我正在编写一个带有签名

的函数foo
foo <- function (bar, baz, frobozz, quux = TRUE, frotz = 42) {
           # etc.
       }

如果在这个函数体内,我希望得到函数在运行时收到的实际参数的命名列表,我可以定义

actual_args <- list(bar = bar, baz = baz, frobozz = frobozz, quux = quux,
                    frotz = frotz)

...但是这个分配很难维护,因为每次添加,删除或重命名参数时都需要修改它。 (更不用说写作也很乏味。)

有没有办法初始化actual_args对于函数签名的未来变化保持不变?

2 个答案:

答案 0 :(得分:3)

请参阅?match.call

foo <- function(a, b, c, d, ...)
match.call()

foo(1, 2, 3, bar, e=baz())
# foo(a = 1, b = 2, c = 3, d = bar, e = baz())

这是一个调用对象,其第一个参数是名为(在这种情况下为foo)的函数的名称。其他参数是foo未评估的参数。

foo(1, 2, 3, bar, e=baz())[[1]]
# foo

foo(1, 2, 3, bar, e=baz())[[2]]
# 1

# the name of a variable
foo(1, 2, 3, bar, e=baz())[[5]]
# bar

# a function call
foo(1, 2, 3, bar, e=baz())[[6]]
# baz()

答案 1 :(得分:2)

您可以在函数中使用 import {Component, OnInit, ElementRef} from '@angular/core'; import * as D3 from 'd3'; import {FetchDataComponent} from '../fetch-data/fetch-data.component'; @Component({ selector: 'app-dubai-dual-line-chart', templateUrl: './dubai-dual-line-chart.component.html', styleUrls: ['./dubai-dual-line-chart.component.css'], providers: [FetchDataComponent] }) export class parseData implements OnInit { public csv; constructor(private __fetchDataComponent: FetchDataComponent) {} ngOnInit() { this.getCsv(); } private getCsv() { this.__fetchDataComponent.getCsv().subscribe( data => { this.csv = data }, err => console.error(err), () => console.log('done loading csv') ) } } 来获取所定义的所有变量的列表。如果您在函数启动后立即调用,则会获得所有参数的列表。然后,您可以使用ls()将这些值放入列表中。例如

mget()

这适用于您的foo<-function(a,b,c) { mget(ls()) } / do.call方案

mapply