【问题标题】:Constructing a function manually in R在 R 中手动构造函数
【发布时间】:2014-06-04 17:07:06
【问题描述】:

作为 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

出于好奇,我尝试对函数定义做同样的事情。函数通常使用 function(args) body 语法构造,但在 R 中也存在一个名为 function 的函数。我遇到的问题是函数的未评估定义将包含一个配对列表:

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

$a
[empty symbol]

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

> substitute(`function`(x, {x + 1}))
Error: badly formed function expression
> substitute(`function`((x), {x + 1}))
function(`(`, x) {
    x + 1
}

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

这可以通过使用第一个参数作为调用的名称来滥用:

> substitute(`function`(a(x), {x + 1}))
function(a, x) {
     x + 1
}

但是,调用实际上并未转换为配对列表,而只是看起来如此。评估此表达式时,将引发错误。以某种方式将列表/对列表插入到调用替换的结果中是理想的。有谁知道怎么做?

【问题讨论】:

  • this 的问题有帮助吗?
  • 我希望直接使用原始函数`function`,因为我相信这是 R 在构造函数时评估的内容。
  • 在我链接的答案中查看make_function4,我认为这就是您所指的版本。
  • 您可能会发现adv-r.had.co.nz/Functions.html 的章节很有用。
  • 不知道你的目标是什么,但我会开始考虑适当的类定义。我认为您的控制结构可能只是方法。

标签: r function expression


【解决方案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}

【讨论】:

    猜你喜欢
    • 2016-01-29
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2021-08-16
    相关资源
    最近更新 更多