gpt4 book ai didi

r - 我可以避免在 R 中使用 `eval(parse())` 定义函数 `polynomial()` 吗?

转载 作者:行者123 更新时间:2023-12-02 11:17:57 24 4
gpt4 key购买 nike

我想避免在包含 polynomial() 的函数定义中使用 parse()

我的多项式是这样的:

library(polynom)
polynomial(c(1, 2))
# 1 + 2*x

我想创建一个使用此多项式表达式的函数,如下所示:

my.function <- function(x) magic(polynomial(c(1, 2))) 

对于magic(),我尝试了表达式()formula()eval()的各种组合as.character()等...但似乎没有任何作用。

我唯一有效的解决方案是使用eval(parse()):

eval(parse(text = paste0('poly_function <- function(x) ', polynomial(c(1, 2)))))

poly_function(x = 10)
# 21

有更好的方法来实现我想要的吗?我可以避免eval(parse())吗?

最佳答案

和你一样,我也认为多项式函数返回一个 R 表达式,但我们都错了。阅读 package:polynom 的帮助索引会对我们双方都有帮助:

str(pol)
#Class 'polynomial' num [1:2] 1 2
help(pac=polynom)

所以 user20650 是正确的并且:

    > poly_function <- as.function(pol)
> poly_function(10)
[1] 21

作者(Venables、Hornick、Maechler)就是这样做的:

> getAnywhere(as.function.polynomial)
A single object matching ‘as.function.polynomial’ was found
It was found in the following places
registered S3 method for as.function from namespace polynom
namespace:polynom
with value

function (x, ...)
{
a <- rev(coef(x))
w <- as.name("w")
v <- as.name("x")
ex <- call("{", call("<-", w, 0))
for (i in seq_along(a)) {
ex[[i + 2]] <- call("<-", w, call("+", a[1], call("*",
v, w)))
a <- a[-1]
}
ex[[length(ex) + 1]] <- w
f <- function(x) NULL
body(f) <- ex
f
}
<environment: namespace:polynom>

既然您在评论中提到 getAnywhere 是新的,那么您也可能可以通过查看使用它的“运行”来获得 yield 。如果您在控制台提示符下键入函数名称,您将获得代码,在本例中:

> as.function
function (x, ...)
UseMethod("as.function")
<bytecode: 0x7f978bff5fc8>
<environment: namespace:base>

这在你跟进之前是毫无帮助的:

> methods(as.function)
[1] as.function.default as.function.polynomial*
see '?methods' for accessing help and source code

多项式版本末尾的星号告诉您该代码未“导出”,即只需通过键入即可在控制台上使用。因此,您需要使用 getAnywhere 将其从加载的命名空间中 pry 出。

关于r - 我可以避免在 R 中使用 `eval(parse())` 定义函数 `polynomial()` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44789564/

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