在函数/ R语言中调用函数的参数

时间:2016-10-28 13:14:24

标签: r function

我有一个功能:

func <- function (x)
{
  arguments <- match.call()
  return(arguments)
}

1)如果我通过在通话中指定参数调用我的函数:

func("value")

我明白了:

func(x = "value") 

2)如果我通过传递变量来调用我的函数:

my_variable <-"value"
func(my_variable)

我明白了:

func(x = my_variable)

为什么第一个和第二个结果不同?
我可以以某种方式进入第二个调用“func(x =”value“)”?

我认为我的问题是函数中的Environment如果通过变量传递则根本不包含值。环境仅包含用于进一步查找的变量名称。有没有办法遵循这样的引用并从函数内部获取价值?

2 个答案:

答案 0 :(得分:1)

在R中,当您将my_variable作为正式参数x传递给函数时,只有当函数尝试读取my_variable时才会检索x的值(如果它不使用x,则根本不会读取my_variable。当您传递更复杂的参数时也是如此,例如func(x = compute_my_variable()) - 当compute_my_variable尝试阅读func时,对x的调用将会发生(这称为懒惰的评价)。

鉴于懒惰的评估,你试图做的事情由于副作用而没有明确定义 - 你想以哪种顺序评估参数?你想评估哪些论点? (注意一个函数可以使用substitute为其参数创建一个表达式,但不对它进行求值)。作为副作用,compute_my_variable可以修改会影响另一个func参数结果的内容。即使您只将变量和常量作为参数传递(函数func可以修改稍后将读取的某些变量,甚至读取my_variable之类的变量也可能触发将修改的代码,这种情况也会发生稍后将读取的一些变量,例如使用活动绑定或延迟分配)。

因此,如果您只想记录函数的调用方式,则可以使用sys.call(或match.call,但确实会扩展参数名称等)。如果您想要更完整的堆栈跟踪,可以使用例如traceback(1)

如果由于某种原因你真的想要所有参数的,就好像它们都按match.call的顺序读取,这是它们被声明的顺序,你可以使用eval(将它们作为列表返回)来执行:

lapply(as.list(match.call())[-1], eval)

答案 1 :(得分:0)

你不能简单地

return paste('func(x =', x, ')')