【问题标题】:building call()s prgramatically以编程方式建立呼叫
【发布时间】: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[]" 我想要一个 funtext 的函数,它准确地返回对 str(mtcars[]) 的调用。
  • 是的,好吧,这听起来不像你应该做的事情。至少,你没有给出想要这个的理由。如果你有充分的理由,我建议你不要传递字符串而是表达式。

标签: r expression call


【解决方案1】:

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

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

【讨论】:

  • 我没有更好的,我们可以为这些情况定义as.language &lt;- function(x) eval(parse(text = paste0("quote(", x, ")")))
【解决方案2】:

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

比如我写了这个函数:

str_limited &lt;- 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 ...

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

我的解决方案一般是在有疑问的时候,写一个函数!

【讨论】:

  • 谢谢卡米尔。然而,但这只是一个最小的例子。我不是在寻找这个特定的功能。 my_code 可以是任何东西,实际上它来自函数参数,因为这确实是在函数中使用的。
猜你喜欢
  • 1970-01-01
  • 2017-05-23
  • 2010-09-23
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多