建立call()s prgramatically

时间:2017-12-22 14:39:23

标签: r expression call

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

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 :::),但问题出现在函数名称中。

提前感谢任何见解。

2 个答案:

答案 0 :(得分:1)

不完全优雅,但这有效:

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

答案 1 :(得分: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 ...

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

我的解决方案通常在有疑问时,写一个函数!