Le 12/05/11 21:59, Hadley Wickham a écrit :

Is it possible to "recursively" parse srcrefs to match the recursive
structure of the underlying code?  I'm interested in this because it's

I don't understand what you mean by that.  It is certainly possible to walk
through nested srcrefs, to zoom in on a particular location; that's what
findLineNum() does.

Does the example below not help?  Given the whole function, I want to
be able to walk down the call tree, finding the matching src refs as I
go.  i.e. given f, how do I get f_inside?

f<- function(x = T) {
   # This is a comment
   if (x)                  return(4)
   if (emergency_status()) return(T)
}

f_inside<- parse(text = "
   # This is a comment
   if (x)                  return(4)
   if (emergency_status()) return(T)
")

findLineNum doesn't quite do what I want - it works on the text of the
srcref, not on the parse tree.

Here's another go at explaining what I want:

h<- quote(
   1 # one
   + # plus
   2 # two
)

h[[1]] extracts +.  What can I do to extract "+ # plus" (on an object
created in the appropriate manner to keep the srcref)?  Is that even
possible?

Maybe the parser package can help you.

> x <- parser( "/tmp/test.R" )
> attr( x, "data" )
line1 col1 byte1 line2 col2 byte2 token id parent top_level token.desc terminal text 1 1 0 0 1 1 1 263 1 3 0 SYMBOL TRUE h 2 1 1 1 1 3 3 265 2 32 0 LEFT_ASSIGN TRUE <- 3 1 0 0 1 1 1 77 3 32 0 expr FALSE 4 1 4 4 1 9 9 296 5 7 0 SYMBOL_FUNCTION_CALL TRUE quote 5 1 9 9 1 10 10 40 6 30 0 '(' TRUE ( 6 1 4 4 1 9 9 77 7 30 0 expr FALSE 7 2 3 3 2 4 4 261 10 11 0 NUM_CONST TRUE 1 8 2 3 3 2 4 4 77 11 27 0 expr FALSE 9 2 5 5 2 10 10 289 13 27 0 COMMENT TRUE # one 10 3 3 3 3 4 4 43 16 27 0 '+' TRUE + 11 3 5 5 3 11 11 289 18 27 0 COMMENT TRUE # plus 12 4 3 3 4 4 4 261 21 22 0 NUM_CONST TRUE 2 13 4 3 3 4 4 4 77 22 27 0 expr FALSE 14 4 5 5 4 10 10 289 24 30 0 COMMENT TRUE # two 15 5 0 0 5 1 1 41 26 30 0 ')' TRUE ) 16 2 3 3 4 4 4 77 27 30 0 expr FALSE 17 1 4 4 5 1 1 77 30 32 0 expr FALSE 18 1 0 0 5 1 1 77 32 0 0 expr FALSE

Romain

My eventual goal is something like

f<- function(x) {
   # This is my function
   T
}

g<- fix_logical_abbreviations(f)

which would be equivalent to

g<- function(x) {
   # This is my function
   TRUE
}


That last display looks like a bug indeed.  I'll take a look.

The key seems to be a leading newline:

parse(text = "\nx")
parse(text = "x")

Hadley




--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
http://romain-francois.com
|- http://bit.ly/hdKhCy : Rcpp article in JSS
|- http://bit.ly/elZJRJ : Montpellier Comedie Club - Avril 2011
`- http://bit.ly/fhqbRC : Rcpp workshop in Chicago on April 28th

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to