我想构建这样的函数调用:
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 :::),但问题出现在函数名称中。
提前感谢任何见解。
答案 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 ...
如果我理解正确的话,那就是你在评估时要寻找的输出。
我的解决方案通常在有疑问时,写一个函数!