当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R substitute 替换和引用表达式


R语言 substitute 位于 base 包(package)。

说明

substitute 返回(未计算的)表达式 expr 的解析树,替换 env 中绑定的任何变量。

quote 只是返回其参数。该参数不进行求值,可以是任何 R 表达式。

enquote 是一个简单的 one-line 实用程序,它将 Foo(....) 形式的调用转换为 quote(Foo(....)) 形式的调用。这通常用于保护 call 免受早期评估。

用法

substitute(expr, env)
quote(expr)
enquote(cl)

参数

expr

任何语法上有效的R表达式

cl

a call,即R的对象class(和mode)"call".

env

环境或列表对象。默认为当前评估环境。

细节

substitute 的典型用途是为数据集和绘图创建信息标签。下面的 myplot 示例展示了此函数的简单用法。它使用函数 deparsesubstitute 为绘图创建标签,这些标签是函数 myplot 的实际参数的字符串版本。

通过检查解析树的每个组件来进行替换,如下所示:如果它不是 env 中的绑定符号,则它保持不变。如果它是一个 Promise 对象,即函数的形式参数或使用 delayedAssign() 显式创建,则 Promise 的表达式槽将替换该符号。如果它是普通变量,则替换其值,除非env.GlobalEnv,在这种情况下符号保持不变。

quotesubstitute 都是 ‘special’ primitive 函数,它们不计算其参数。

结果的mode通常是"call",但原则上可以是任何类型。特别是,single-variable 表达式具有模式 "name",常量具有适当的基本模式。

注意

substitute 在纯粹的词汇基础上工作。不能保证结果表达式有任何意义。

当参数为 expression(...) 时,替换和引用通常会引起混乱。结果是对 expression 构造函数的调用,需要使用 eval 进行计算以给出实际的表达式对象。

例子

require(graphics)
(s.e <- substitute(expression(a + b), list(a = 1)))  #> expression(1 + b)
(s.s <- substitute( a + b,            list(a = 1)))  #> 1 + b
c(mode(s.e), typeof(s.e)) #  "call", "language"
c(mode(s.s), typeof(s.s)) #   (the same)
# but:
(e.s.e <- eval(s.e))          #>  expression(1 + b)
c(mode(e.s.e), typeof(e.s.e)) #  "expression", "expression"

substitute(x <- x + 1, list(x = 1)) # nonsense

myplot <- function(x, y)
    plot(x, y, xlab = deparse1(substitute(x)),
               ylab = deparse1(substitute(y)))

## Simple examples about lazy evaluation, etc:

f1 <- function(x, y = x)             { x <- x + 1; y }
s1 <- function(x, y = substitute(x)) { x <- x + 1; y }
s2 <- function(x, y) { if(missing(y)) y <- substitute(x); x <- x + 1; y }
a <- 10
f1(a)  # 11
s1(a)  # 11
s2(a)  # a
typeof(s2(a))  # "symbol"

参考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

也可以看看

missing对于参数‘missingness’,bquote对于部分替换,sQuotedQuote用于向字符串添加引号。Quotes关于正引号、反引号和双引号 ‘⁠′⁠', '⁠`⁠', 和 '⁠”⁠’。

all.names 从表达式或调用中检索符号名称。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Substituting and Quoting Expressions。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。