首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中引语和表达式的差异

R中引语和表达式的差异
EN

Stack Overflow用户
提问于 2014-10-23 15:25:36
回答 2查看 1.9K关注 0票数 10
代码语言:javascript
复制
gettypes = function(x) {paramx = substitute(x); print(typeof(paramx)); print(class(paramx)); print(mode(paramx))}
gettypes(expression(sin(x+y)))
# [1] "language"
# [1] "call"
# [1] "call"
gettypes(quote(sin(x+y)))
# [1] "language"
# [1] "call"
# [1] "call"
expression(sin(x+y)) == quote(sin(x+y))

expression(sin(x + y)) == quote(sin(x + y))中的错误:表达式不允许进行比较

代码语言:javascript
复制
identical(expression(sin(x+y)), quote(sin(x+y)))
# [1] FALSE
x = 1
y = 2
eval(expression(sin(x+y)))
# [1] 0.14112
eval(quote(sin(x+y)))
# [1] 0.14112

他们长得差不多。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-23 15:43:36

  • expression将其参数作为未计算表达式的向量返回。
  • quote将其参数作为未计算的表达式返回。

试试这个:

代码语言:javascript
复制
(e1 <- quote(sin(x+y)))
# sin(x + y)
(e2 <- expression(sin(x+y)))
# expression(sin(x + y))
str(e1)
# language sin(x + y)
str(e2)
# expression(sin(x + y))
str(e2[[1]])
# language sin(x + y)
all.equal(e1, e2)
# [1] "Modes of target, current: call, expression" "target, current do not match when deparsed"
all.equal(e1, e2[[1]])
# [1] TRUE

另一个例子是:

代码语言:javascript
复制
e2 = expression(sin(x+y), x+y)
e2
# expression(sin(x + y), x + y)
e2[1]
# expression(sin(x + y))
e2[2]
# expression(x + y)
票数 16
EN

Stack Overflow用户

发布于 2018-10-15 18:47:14

@kohske已经回答得很好了,但要指出表达式实际上只是一个未计算的表达式的列表,如引号返回的表达式,并使用一个class表达式:

代码语言:javascript
复制
x <- list(quote(2*3),quote(4*5))
class(x) <- "expression"
identical(x, expression(2*3, 4*5))
# [1] TRUE

但是,expression的模式不是"list",而是"expression",例如,与data.frame不同:

代码语言:javascript
复制
e <- expression(2*3, 4*5)
class(e)
# [1] "expression"
mode(e)
# [1] "expression"
class(unclass(e))
# [1] "expression"
is.list(e)
# [1] FALSE


class(iris)
# [1] "data.frame"
mode(iris)
# [1] "list"
class(unclass(iris))
# [1] "list"
is.list(iris)
# [1] TRUE

现在,不同的类可能意味着非常不同的方法,但在实践中,至少在基本R中没有很多方法:

代码语言:javascript
复制
methods(class="expression")
# [1] coerce Ops   

methods(class="list")
# [1] all.equal     as.data.frame coerce        Ops           relist        type.convert  within

因此,将表达式视为未计算表达式的列表似乎相当安全,而且当尝试使用表达式时出现问题时(例如,我们将使用列表),as.list将非常安全:

代码语言:javascript
复制
with(expression(a=2*3, 4*5),a)
# Error in eval(substitute(expr), data, enclos = parent.frame()) : 
#   invalid 'envir' argument of type 'expression'
with(as.list(expression(a=2*3, 4*5)),a)
# 2 * 3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26531615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档