r - `{` 是一个类吗?

标签 r oop

我对在 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/

相关文章:

javascript - 使用 OOP 方法重新启动 Canvas 动画

c# - C# : How to ensure an object instance can only be created by a factory class? 中的工厂模式

r - 计算 R 的 data.frame 中成员资格的频率

r - 如何从 RStudio Gadget 中打开 Shiny 应用程序

javascript - 在构造函数与原型(prototype)中声明 javascript 对象方法

Java面向对象设计

regex - 字符串中字符位置的转义字符 : R lang

r - 使用R从网页中抓取可下载文件的链接地址?

R - 将列名传递到 data.table 公式中 - get 和 eval 之间的区别

oop - MATLAB 类的 Description 和 DetailedDescription 属性