以编程方式构建调用

building call()s prgramatically

我想像这样构造函数调用:

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

提前感谢您的任何见解。

我不太擅长 quote / enquote 函数,但是为您要发送到 [=12 的内容编写一个小函数可能很容易=],在这种情况下,只获取某些列的结构。

比如我写了这个函数:

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

您可以使用要子集化的行数 and/or 来调用它,然后将其用作进入 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 ...

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

我的解决办法一般是有疑问就写一个函数!

不是很优雅,但这很有效:

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