【发布时间】:2018-06-05 05:02:07
【问题描述】:
我想构造这样的函数调用:
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 :::),但问题在于函数名称。
提前感谢您提供任何见解。
【问题讨论】:
-
my_code不是名字。这是一个函数调用。您需要使用parse。但这让人想起了财富包中的一句名言:如果parse是答案,那么你问错了问题。 -
谢谢 Roland,但是解析也不起作用,因为如果我调用("str", parse(text = my_code)),我得到的是:str(expression(mtcars[, 1: 2]))。此外,my_code 可以是任何东西,包括我第一个示例中的名称。
-
你需要更详细地解释你想要做什么以及为什么。您必须解析字符串。现在的问题是下一步该做什么,但您没有充分指定目标。
-
我想以编程方式进行调用,其中要调用的函数和参数存储在文本字符串中。目标是将这样的调用作为函数的结果返回,就好像调用是手动编写的一样。例如,如果
fun = "str"和text = "mtcars[]"我想要一个fun和text的函数,它准确地返回对str(mtcars[])的调用。 -
是的,好吧,这听起来不像你应该做的事情。至少,你没有给出想要这个的理由。如果你有充分的理由,我建议你不要传递字符串而是表达式。
标签: r expression call