gpt4 book ai didi

r - 在 R 中手动构建函数

转载 作者:行者123 更新时间:2023-12-04 02:28:10 24 4
gpt4 key购买 nike

作为 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 构造语法但也存在一个名为 function 的函数在 R 中。我遇到的问题是未评估的函数定义将包含一个pairlist:
> 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
}

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

最佳答案

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

试试这个代码:

   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}

关于r - 在 R 中手动构建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24043479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com