R中的一个bquote拼接

Cla*_*ley 9 r

假设我正在使用R的反引号运算符构建表达式bquote,并且我想在特定位置的列表中"拼接"(即,丢失列表的外括号).

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

所以:

>   b = quote(5+4)
>   b
5 + 4
>   c = bquote(6-.(b))
>   c
6 - (5 + 4)
>   eval(c)
[1] -3
Run Code Online (Sandbox Code Playgroud)

我希望能够返回"6-5 + 4"的评价,所以5.

在常见的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> 
Run Code Online (Sandbox Code Playgroud)

我尝试在R中使用.@(b),但这不起作用.还有其他想法吗?重申一下,我不想诉诸字符串操作.

Jas*_*gan 5

这是个有趣的问题.在玩了一些东西之后,这就是我能为你的特定例子想出来的.

> b <- quote(5 + 4)
> b[[2]] <-  bquote(6 - .(b[[2]]))
> b
6 - 5 + 4
> eval(b)
[1] 5
Run Code Online (Sandbox Code Playgroud)

遗憾的是,考虑到您必须考虑评估顺序等,这可能很难概括.


42-*_*42- 3

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

> b = quote(5+4)
>  b[[1]]
`+`
> b = quote(5+4)
>  b[[2]]
[1] 5
> b = quote(5+4)
>  b[[3]]
[1] 4
Run Code Online (Sandbox Code Playgroud)

而语言对象的 print 方法可能会让您认为第二个参数是6 -5 +46-5....

> b2 <- bquote(6 - 5 + 4)
> b2[[1]]
`+`
> b2[[2]]
6 - 5
Run Code Online (Sandbox Code Playgroud)

……这也是幻觉。它确实有一个列表结构。(我本以为这是 Lisp 用户所期望的。)

> b2[[3]]
[1] 4
> b2[[2]][[1]]
`-`
> b2[[2]][[2]]
[1] 6
> b2[[2]][[3]]
[1] 5
Run Code Online (Sandbox Code Playgroud)

  • 我确实意识到它是底层的 AST,但这并不能真正直接解决问题。 (2认同)