在R中手动构造函数

Jon*_*aus 11 expression r function

作为R是函数式语言的症状,可以使用纯函数符号指定许多控制结构.例如,if语句:

> as.list((substitute(if(a == 1) 1 else 2)))
[[1]]
`if`

[[2]]
a == 1

[[3]]
[1] 1

[[4]]
[1] 2

> as.list(substitute(`if`(a == 1, 1, 2)))
[[1]]
`if`

[[2]]
a == 1

[[3]]
[1] 1

[[4]]
[1] 2
Run Code Online (Sandbox Code Playgroud)

出于好奇,我试图对函数定义做同样的事情.函数通常使用function(args) body语法构造,但也存在一个以functionR 命名的函数.我遇到的问题是函数的未评估定义将包含一个pairlist:

> substitute(function(x = 1, a) {x + a})[[2]]
$x
[1] 1

$a
[empty symbol]
Run Code Online (Sandbox Code Playgroud)

第二个参数是参数名称和默认值之间的一个参数,它们可能是空符号.据我所知,仅使用手动调用就不可能将列表或pairlist作为表达式的一部分传递.以下是我的尝试:

> substitute(`function`(x, {x + 1}))
Error: badly formed function expression
> substitute(`function`((x), {x + 1}))
function(`(`, x) {
    x + 1
}
Run Code Online (Sandbox Code Playgroud)

如果我将单个符号作为第二个参数传递给`function`,则抛出一个错误(这对于具有多个参数的函数不起作用).当将调用作为第二个参数传递时,调用似乎在被解析时被强制转换为列表.

使用第一个参数作为调用名称可能会滥用此操作:

> substitute(`function`(a(x), {x + 1}))
function(a, x) {
     x + 1
}
Run Code Online (Sandbox Code Playgroud)

但是,呼叫实际上并没有转换为一个pairlist,而且似乎只是这样.在计算此表达式时,会引发错误.以某种方式将列表/ pairlist插入到替换调用的结果中是理想的.有谁知道怎么做?

Lee*_*eya 1

这不会是即时答案,但我只是试图专注于您的函数调用。

只需尝试以下代码:

   as.list((substitute(function(x = 1, a) {x + a})))
   [[1]]

    `function`

  [[2]]

  [[2]]$x

  [1] 1

  [[2]]$a

  [[3]]
   {
      x + a
    }
 [[4]]
      function(x = 1, a) {x + a}
Run Code Online (Sandbox Code Playgroud)