以编程方式构建调用
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])
我想像这样构造函数调用:
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])