On 02/19/2010 10:31 PM, William Dunlap wrote:
-----Original Message-----
From: r-help-boun...@r-project.org
[mailto:r-help-boun...@r-project.org] On Behalf Of blue sky
Sent: Friday, February 19, 2010 12:11 PM
To: Peter Dalgaard
Cc: r-h...@stat.math.ethz.ch
Subject: Re: [R] What is the difference between expression
and quote whenused with eval()?
On Fri, Feb 19, 2010 at 12:39 PM, Peter Dalgaard
<p.dalga...@biostat.ku.dk> wrote:
blue sky wrote:
I made the following example to see what are the difference between
expression and quote. But I don't see any difference when they are
used with eval()? Could somebody let me know what the difference is
between expression and quote?
Expressions are vectors of unevaluated expressions, so one
difference is
that expressions can have more than one element.
Another difference is more subtle: objects of mode
"expression" are better
at retaining their identity as an unevaluated expression
eval(substitute(2+x,list(x=expression(pi))))
Error in 2 + expression(pi) : non-numeric argument to
binary operator
eval(substitute(2+x,list(x=quote(pi))))
[1] 5.141593
The really convincing application of this escapes me for
the moment, but the
gist of it is that there are cases where a quoted
expression may blend in a
bit too seemlessly when using computing on the language.
Also, expression objects are more easy to recognize
programmeatically,
quote() may result in objects of mode "call", "name", or
one of the base
classes.
I want to see how expression(something) and quote(something) are
represented in R internally. But it seems that str() doesn't go to
that low level. Is there a way to show the internal representation?
There is also the internal inspect function :
> inspect <- function(x, ...) .Internal(inspect(x,...))
> inspect( expression(log(1), sqrt(2), trunc(pi)) )
@9657560 20 EXPRSXP g0c2 [NAM(2)] (len=3, tl=153865256)
@97ab5e8 06 LANGSXP g0c0 []
@92cf3fc 01 SYMSXP g0c0 [MARK,gp=0x4000] "log"
@9709a28 14 REALSXP g0c1 [] (len=1, tl=0) 1
@97aa750 06 LANGSXP g0c0 []
@92cf204 01 SYMSXP g0c0 [MARK,gp=0x4000] "sqrt"
@97099e8 14 REALSXP g0c1 [] (len=1, tl=0) 2
@97aa84c 06 LANGSXP g0c0 []
@92cf15c 01 SYMSXP g0c0 [MARK,gp=0x4000] "trunc"
@9347c38 01 SYMSXP g0c0 [MARK,gp=0x4000] "pi"
Romain
I use the following, which shows
`name` class(length)
for each element of a recursive object and
then shows the offspring indented more than
the parent. It does not go into the attributes,
nor does it try to outwit classes that may
have special methods for as.list(), length(),
or names(). It is handy for checking operator
precedence.
str.language<-
function (object, ..., level=0, name=deparse(substitute(object)))
{
abbr<-function(string, maxlen=25){
if(length(string)>1||nchar(string)>maxlen)
paste(substring(string[1], 1, maxlen), "...", sep="")
else
string
}
cat(rep(" ", level), sep="")
if (is.null(name))
name<- ""
cat(sprintf("`%s` %s(%d): %s\n", abbr(name),
class(object), length(object), abbr(deparse(object))))
if (is.recursive(object)) {
object<- as.list(object)
names<- names(object)
for(i in seq_along(object)) {
str.language(object[[i]], ...,
level = level+1, name = names[i])
}
}
}
E.g.,
str.language(function(x,y=log(10))log(x)/y)
`function(x, y = log(10)) ...` function(1): function (x, y = log(10))...
`x` name(1):
`y` call(2): log(10)
`` name(1): log
`` numeric(1): 10
`` call(3): log(x)/y
`` name(1): /
`` call(2): log(x)
`` name(1): log
`` name(1): x
`` name(1): y
str.language(expression(log(1), sqrt(2), trunc(pi)))
`expression(log(1), sqrt(2...` expression(3): expression(log(1), sqrt(2...
`` call(2): log(1)
`` name(1): log
`` numeric(1): 1
`` call(2): sqrt(2)
`` name(1): sqrt
`` numeric(1): 2
`` call(2): trunc(pi)
`` name(1): trunc
`` name(1): pi
str.language(quote(log(pi)))
`quote(log(pi))` call(2): log(pi)
`` name(1): log
`` name(1): pi
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
expr=expression(2*3)
quo=quote(2*3)
eval(expr)
str(expr)
class(expr)
typeof(expr)
mode(expr)
attributes(expr)
eval(quo)
str(quo)
class(quo)
typeof(quo)
mode(quo)
attributes(quo)
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
--
O__ ---- Peter Dalgaard Ă˜ster Farimagsgade 5, Entr.B
c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K
(*) \(*) -- University of Copenhagen Denmark Ph:
(+45) 35327918
~~~~~~~~~~ - (p.dalga...@biostat.ku.dk) FAX:
(+45) 35327907
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://tr.im/OIXN : raster images and RImageJ
|- http://tr.im/OcQe : Rcpp 0.7.7
`- http://tr.im/O1wO : highlight 0.1-5
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.