当内部有嵌套函数时,如何在 R 中以编程方式创建函数?
How to create a function programatically in R when there is a nested function inside?
我的目标是使用代码创建以下函数:
s <- c(x = 10)
a <- c(i = 3)
model <- function(s, a) {
with(as.list(c(s, a)), {
y <- x * i
y * 10
})
}
model(s, a)
结果应该是 300。
我正在解析另一个软件,我可以从该软件中提取方程式作为字符串。所以,我需要从这些字符串构造函数的主体。
我一直在尝试使用 rlang 库,但无济于事。
library(rlang)
func_body <- "with(as.list(c(s, a)), {
y <- x * i
y * 10
})";
foo <- new_function(
exprs(s =, a = ),
expr(!!parse(text = func_body))
)
有什么想法吗?
不确定您在这里使用 new_function
的动机,但这给出了您的预期输出:
library(rlang)
s <- (x = 10)
a <- (i = 3)
foo <- new_function(
args = pairlist2(s =, a =),
body = expr(
with(as.list(c(s, a)), {
y <- x * i
y * 10
})
)
)
foo(s, a)
#[1] 300
如果正文是字符串使用 parse_expr
:
foo2 <- new_function(
args = pairlist2(s =, a =),
body = parse_expr(
"with(as.list(c(s, a)), {
y <- x * i
y * 10
})"
)
)
foo2(s, a)
#[1] 300
使用 base R 你可以做到:
foo <- function(s, a){}
body(foo) <- parse(text=func_body)
foo(s, a)
#> [1] 300
另一种方法,仍然在基础 R 中是:
foo <- as.function(c(alist(s=,a=), parse(text=func_body)[[1]]))
foo(s, a)
#> [1] 300
作为旁注,在您的示例中根本没有使用 s
和 a
的值,您只是使用全局工作区中的 x 和 i 的值。你可能想要:
# cleanup
rm(s,a,x,i)
s <- c(x = 10)
a <- c(i = 3)
foo(s, a)
#> [1] 300
我的目标是使用代码创建以下函数:
s <- c(x = 10)
a <- c(i = 3)
model <- function(s, a) {
with(as.list(c(s, a)), {
y <- x * i
y * 10
})
}
model(s, a)
结果应该是 300。
我正在解析另一个软件,我可以从该软件中提取方程式作为字符串。所以,我需要从这些字符串构造函数的主体。
我一直在尝试使用 rlang 库,但无济于事。
library(rlang)
func_body <- "with(as.list(c(s, a)), {
y <- x * i
y * 10
})";
foo <- new_function(
exprs(s =, a = ),
expr(!!parse(text = func_body))
)
有什么想法吗?
不确定您在这里使用 new_function
的动机,但这给出了您的预期输出:
library(rlang)
s <- (x = 10)
a <- (i = 3)
foo <- new_function(
args = pairlist2(s =, a =),
body = expr(
with(as.list(c(s, a)), {
y <- x * i
y * 10
})
)
)
foo(s, a)
#[1] 300
如果正文是字符串使用 parse_expr
:
foo2 <- new_function(
args = pairlist2(s =, a =),
body = parse_expr(
"with(as.list(c(s, a)), {
y <- x * i
y * 10
})"
)
)
foo2(s, a)
#[1] 300
使用 base R 你可以做到:
foo <- function(s, a){}
body(foo) <- parse(text=func_body)
foo(s, a)
#> [1] 300
另一种方法,仍然在基础 R 中是:
foo <- as.function(c(alist(s=,a=), parse(text=func_body)[[1]]))
foo(s, a)
#> [1] 300
作为旁注,在您的示例中根本没有使用 s
和 a
的值,您只是使用全局工作区中的 x 和 i 的值。你可能想要:
# cleanup
rm(s,a,x,i)
s <- c(x = 10)
a <- c(i = 3)
foo(s, a)
#> [1] 300