English 中文(简体)
substitute known variables in quoted expression
原标题:

I want to write a function f that given:

x <- 1  
f(.(y==x))

It returns the string:

"y == 1"

The function should be general enough, that the expression can be arbitrary. For instance, f(.(y==x & z==x)) should return "y == 1 & z == 1".

Any ideas?

The function:

g <- function(e) as.character(unlist(e))

does not work for me, as it returns "y == x". I want the replacement to take place.

UPDATE:

Also, this question is not a duplicate of How do I substitute symbols in a language object? I want to create a function f, that means that somehow I need to get the value of x from the caller s environment. My current attempt is this:

require(plyr)
x <- 1
f <- function(e) do.call(substitute, list(e[[1]], parent.frame(1)))
f(.(y==x & z==x))

But it still does not work. Maybe I should use something else instead of parent.frame?

Many thanks.

问题回答
 library(plyr)
 g <- function(e) { 
      e[[1]][[3]] <- eval.parent(e[[1]][[3]])
      deparse(e[[1]]) 
 }
 x <- 1
 g(.(y==x))

This works, but is perhaps not as general as you wanted. (I would rather have a solution that substituted values if possible and left the values alone otherwise.)

UPDATE: not working yet, but maybe helpful.

 g <- function(e) {
      e1 <- e[[1]]
      pe <- parent.env(environment())
      vars <- all.vars(e1)
      ss <- setNames(lapply(vars,
                   function(v) if (exists(v,pe)) get(v,pe) else v),
                     vars)
      ## at this point I m stumped -- have tried various
      ## versions of eval, lapply, rapply, substitute ...
      ## afraid I would actually have to make up my own recursive
      ## function since rapply() only works on lists ...
 }
f <- function(e) {
    deparse(do.call("substitute", list(e, as.list(parent.frame()))))
}

x <- 1
f(quote(y == x)) # "y == 1"
f(quote(y==x & z==x)) # "y == 1 & z == 1"

I use do.call to construct a substitute call that has the arguments in args evaluated. In the case of f(quote(y == x)), the call will be substitute(y == x, list(x = 1, f = ...)).
I have to use the list as.list(parent.frame()) instead of the environment parent.frame() because according to ?substitute

If it is an ordinary variable, its value is substituted, unless env is .GlobalEnv in which case the symbol is left unchanged.

Calling parent.frame() inside f result in <environment: R_GlobalEnv>

I am not familiar with plyr::. so I use quote in base instead.





相关问题
How to plot fitted model over observed time series

This is a really really simple question to which I seem to be entirely unable to get a solution. I would like to do a scatter plot of an observed time series in R, and over this I want to plot the ...

REvolution for R

since the latest Ubuntu release (karmic koala), I noticed that the internal R package advertises on start-up the REvolution package. It seems to be a library collection for high-performance matrix ...

R - capturing elements of R output into text files

I am trying to run an analysis by invoking R through the command line as follows: R --no-save < SampleProgram.R > SampleProgram.opt For example, consider the simple R program below: mydata =...

R statistical package: wrapping GOFrame objects

I m trying to generate GOFrame objects to generate a gene ontology mapping in R for unsupported organisms (see http://www.bioconductor.org/packages/release/bioc/vignettes/GOstats/inst/doc/...

Changing the order of dodged bars in ggplot2 barplot

I have a dataframe df.all and I m plotting it in a bar plot with ggplot2 using the code below. I d like to make it so that the order of the dodged bars is flipped. That is, so that the bars labeled "...

Strange error when using sparse matrices and glmnet

I m getting a weird error when training a glmnet regression. invalid class "dgCMatrix" object: length(Dimnames[[2]]) must match Dim[2] It only happens occasionally, and perhaps only under larger ...

Generating non-duplicate combination pairs in R

Sorry for the non-descriptive title but I don t know whether there s a word for what I m trying to achieve. Let s assume that I have a list of names of different classes like c( 1 , 2 , 3 , 4 ) ...

Per panel smoothing in ggplot2

I m plotting a group of curves, using facet in ggplot2. I d like to have a smoother applied to plots where there are enough points to smooth, but not on plots with very few points. In particular I d ...

热门标签