在构建我发现的函数时,在设置函数体时,复数是不相交的:
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
函数中的复数是否不相交是不是很糟糕? Reworded:R需要更多的计算步骤来计算5*(2+(0+3i))
而不是5*(2+3i)
吗?
答案 0 :(得分: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
时出现的内容中包含额外参数的请求,您可以通过将固定值分配给名称然后在该名称中使用该名称来使其看起来更“完成”。表达式:
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'。
答案 1 :(得分: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"