我对在 R 中用最少的代码修改基本函数的方法很感兴趣。我知道 body
function 将返回任何函数的主体。所以我存储了 body(basefoo)
的输出在变量中 bar
.想了解更多关于它是如何工作的,我检查了 bar
的类。 .这是"{"
.我觉得那是一门奇怪的课。我寻找方法,但 methods(class="\\{")
但它说没有方法。{
有什么原因吗?类存在吗?如何修改或与 {
交互对象?
最佳答案
所有的 R 代码在执行前都会被解析成一个树(更多信息见 Expressions from Advanced R)。为了在树中的任何点有多个表达式,R 需要创建一个包装器/容器来保存这些表达式。这基本上就是 {
类代表。它定义了一个代码块。它是要评估的表达式的集合。想想它是否像一个函数,其中您要评估的每个表达式都是一个参数(至少它是这样存储在树中的)。代码块只返回最后一个表达式返回的值。比较
as.list(quote({a; b}))
# [[1]]
# `{`
# [[2]]
# a
# [[3]]
# b
as.list(quote(c(a, b)))
# [[1]]
# c
# [[2]]
# a
# [[3]]
# b
看看它们是如何在 R 中变成类似的结构的? “函数名”首先是参数列表。您甚至可以调用
{
像常规功能`{`(a<-1, 5, a+2)
# [1] 3
(注意最后一个值是如何唯一返回的)。另请注意,代码块不会创建自己的范围,因此变量
a
如果您在控制台运行它,将在全局环境中定义。您可以通过引用代码块来创建这种类型的对象
class(xx <- quote({a; b}))
# [1] "{"
xx
# {
# a
# b
# }
或通过使用带引号的符号进行调用
class(xx <- as.call(list(quote(`{`), quote(a), quote(b))))
# [1] "{"
xx
# {
# a
# b
# }
函数的主体并不总是
{
类(class)。例如x <- function(a) a+1
y <- function(a) {b <- sqrt(a); b+2}
class(body(x))
# [1] "call"
class(body(y))
# [1] "{"
因为我们想在
y
中运行多个语句我们必须将这些表达式放在代码块中。由于x
只调用一个我们不需要使用的表达式{
所以它有一个不同的类。
关于r - `{` 是一个类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50473504/