1

在构造函数时我发现,在设置函数体时复数是不相交的:

funCplx <- function () {}
formals(funCplx) <- alist(t=)
body(funCplx) <- as.call(c(as.name("{"), parse(text = "t*(2+3i)")))
funCplx
funCplx(3)

如您所见,该函数返回正确的值,但包含t * (2+(0+3i)). 它在c(). 该表达式c(parse(text = "t*(2+3i)"))返回不相交的项,而parse(text = "t*(2+3i)")返回t*(2+3i). 为什么身体里的表情不连贯?

编辑:我向函数添加了一个参数。我因为稀疏而删除了它,但有必要获得正确的解决方案。

编辑2:大多数答案都假设我知道复数(这里2+3i)。我举了这个例子,因为它是最小的。在我的真实案例中,我从变量矩阵中获取许多复数,并将它们放在一个带有附加变量(此处t)和函数(如exp. 在我的第一步中,我paste将不同的部分和parse此文本放入函数体中。

指出我的问题:parse在计算步骤的情况下,复数在函数中不相交是不是很糟糕?5*(2+(0+3i))改写:R 是否需要比更多的计算步骤来计算5*(2+3i)

4

2 回答 2

2

为什么不:

funCplx <- function () {}
formals(funCplx) <- alist()
body( funCplx) <- as.call(c(as.name("{"), eval(parse(text = "2+3i"))) )
funCplx
funCplx()

回报:

funCplx
#----console displays---
function () 
{
    2+3i
}

随着添加了在函数被print-ed 时出现的内容中包含额外参数的请求,您可以通过将固定值分配给名称然后在表达式中使用该名称来使其看起来更“完成”:

funCplx <- function () {}
formals(funCplx) <- alist(t=)
environment(funCplx) <- new.env()
environment(funCplx)$cplx <-  (2+3i)
body(funCplx) <- quote(t*cplx)
funCplx
# function (t) 
# t * cplx
funCplx(3)
# [1] 6+9i

并测试是否修复了早期脆弱的构造错误:

>  cplx=42
> funCplx(7)
[1] 14+21i

较早的方法没有为 funCplx 创建环境,因此它的环境是 . GlobalEnv. 这个版本将随身携带'cplx'。

于 2013-08-18T18:20:48.097 回答
0

要创建一个将参数乘以给定复数常量的表达式,请使用以下命令:

funCplx <- function () {}
formals(funCplx) <- alist(t=)
body(funCplx) <- as.call(c(as.name("{"), call("*", as.symbol("t"), 2+3i)))
funCplx
funCplx(3)

请注意,这避免了2 + (0+3i)在“运行时”进行评估,因为常量在函数体中是“硬编码”的:

> body(funCplx)[[2]][[3]]
[1] 2+3i
> is(body(funCplx)[[2]][[3]])
[1] "complex" "vector"
于 2013-08-18T18:49:13.753 回答