在R中的bquote中拼接

在R中的bquote中拼接,r,metaprogramming,R,Metaprogramming,假设我正在用R的反引号操作符bquote构建一个表达式,我想在列表中的特定位置“拼接”(即,丢失列表的外括号) 例如,我有一个表达式“5+4”,我想在它的开头加上一个“6-”,而不使用字符串操作(也就是说,完全在符号结构上操作) 因此: 我想返回“6-5+4”的评估,所以是5 在common lisp中,后引号“`”操作符与拼接操作符“@”一起使用,以实现以下目的: CL-USER> (setf b `(5 + 4)) (5 + 4) CL-USER> (setf c `(6 -

假设我正在用R的反引号操作符
bquote
构建一个表达式,我想在列表中的特定位置“拼接”(即,丢失列表的外括号)

例如,我有一个表达式“5+4”,我想在它的开头加上一个“6-”,而不使用字符串操作(也就是说,完全在符号结构上操作)

因此:

我想返回“6-5+4”的评估,所以是5

在common lisp中,后引号“`”操作符与拼接操作符“@”一起使用,以实现以下目的:

CL-USER> 
(setf b `(5 + 4))
(5 + 4)
CL-USER> 
(setf c `(6 - ,@b))
(6 - 5 + 4)
CL-USER> 
(setf c-non-spliced `(6 - ,b))
(6 - (5 + 4))
CL-USER> 

我试着在R中使用@(b),但没有用。还有其他想法吗?再说一遍,我不想求助于字符串操作。

您需要意识到,R表达式不是以中缀顺序存储的,它们的打印方法可能会让您相信:

> b = quote(5+4)
>  b[[1]]
`+`
> b = quote(5+4)
>  b[[2]]
[1] 5
> b = quote(5+4)
>  b[[3]]
[1] 4
而语言对象的打印方法可能会让您认为
6-5+4
的第二个参数是
6-5

> b2 <- bquote(6 - 5 + 4)
> b2[[1]]
`+`
> b2[[2]]
6 - 5

这是一个有趣的问题。在玩了一些东西之后,这就是我能为您的特定示例想到的所有内容

> b <- quote(5 + 4)
> b[[2]] <-  bquote(6 - .(b[[2]]))
> b
6 - 5 + 4
> eval(b)
[1] 5
>b b[[2]]b
6 - 5 + 4
>评估(b)
[1] 5

不幸的是,这可能很难概括,因为您必须考虑评估顺序等因素。

在将作为R4.0.0发布的R-devel版本中,
bquote
中有一个新的拼接表达式功能。来自

backquote函数bquote()有一个新的参数splice,用于将计算出的值列表拼接到表达式中,如LISP的backquote中的@

和来自的手动示例


exprs我确实意识到这是一个隐藏的AST,但这并不能直接解决问题。我同意它不能解决问题,但我认为定义问题的适当维度会有所帮助。无论如何,我不能完全相信这是真正的问题,所以我更希望看到“用例”是什么。这肯定暗示了一种实现方法。我有点希望已经有人知道有一个代码漫游库可以做到这一点。不知道在哪里可以找到,甚至不知道什么是“代码漫游库”,但是你看过
bquote
的代码吗?@IShouldBuyABoat如果bquote有拼接功能,这里有一个刚刚发布在SO上的潜在用例:我认为从根本上讲,这都是“字符串操作”。
> b2[[3]]
[1] 4
> b2[[2]][[1]]
`-`
> b2[[2]][[2]]
[1] 6
> b2[[2]][[3]]
[1] 5
> b <- quote(5 + 4)
> b[[2]] <-  bquote(6 - .(b[[2]]))
> b
6 - 5 + 4
> eval(b)
[1] 5