以编程方式构建呼叫

问题描述 投票:2回答:2

我想构建像这样的函数调用:

my_simplecode <- "mtcars"
call("str", as.name(my_simplecode))
#> str(mtcars)

问题是as.name()在代码中包含诸如括号或括号之类的符号时引入了反引号:

my_code <- "mtcars[, 1:2]"
call("str", as.name(my_code))
#> str(`mtcars[, 1:2]`)

并且无法评估此调用。我需要产生str(mtcars[, 1:2])的调用,但我无法摆脱引号。尝试了quote(),enquote(),parse(),deparse(),expression()等的所有组合。没有成功。

请注意,my_code可以是任何东西。变量名,或者更通常是任何表达式,包括函数调用,管道等等。

这类似于Using call() with namespace address (:: or :::),但问题出现在函数名称中。

提前感谢任何见解。

r expression call
2个回答
1
投票

不完全优雅,但这有效:

my_code <- "mtcars[, 1:2]"
my_lang <- eval(parse(text = paste0("quote(", my_code, ")")))
call("str", my_lang)
#> str(mtcars[, 1:2])

0
投票

我不是很擅长quote / enquote函数,但它可能很容易为你想要发送到call的函数编写一个小函数,在这种情况下获得某些列的结构。

例如,我写了这个函数:

str_limited <- function(x, rows, cols) str(x[rows, cols])

您可以使用要子集的行和/或列的数量调用,然后将其用作进入call的函数,使用参数cols = 1:2

call("str_limited", as.name("mtcars"), cols = 1:2)

eval测试结果给出了:

'data.frame': 32 obs. of 2 variables: $ mpg: num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... $ cyl: num 6 6 4 6 8 6 8 4 4 6 ...

如果我理解正确的话,那就是你在评估时要寻找的输出。

我的解决方案一般是有疑问时,写一个函数!

© www.soinside.com 2019 - 2024. All rights reserved.