I think I have found a working solution. Rather ugly, but working and will keep looking for better alternatives, though.
The procedure involves: - parsing one line at a time - if incomplete, parse as many lines as necessary to form an expression - determine all expressions in the original input - evaluate each expression, one at a time (which shows individual errors and warnings) - print each pair of: - expression - error, or result with possible warning(s) It works reasonably quick for small chunks, but that is ok for my purposes. I hope it helps anyone. Should there be better alternatives, I would be more than grateful for a hint. Best, Adrian On Mon, Sep 5, 2016 at 5:33 PM, Bert Gunter <bgunter.4...@gmail.com> wrote: > I'm sharing this with r-help, as your detailed response might help > others help you. > > -- Bert > Bert Gunter > > "The trouble with having an open mind is that people keep coming along > and sticking things into it." > -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > > > On Sun, Sep 4, 2016 at 11:45 PM, Adrian Dușa <dusa.adr...@unibuc.ro> > wrote: > > On Mon, Sep 5, 2016 at 2:52 AM, Bert Gunter <bgunter.4...@gmail.com> > wrote: > >> > >> You might want to look at the "evaluate" package. > > > > > > Of course, forgot to mention. I did try it, but got: > > > >> bar <- readLines("foo.R", warn = FALSE) > >> bar <- paste(bar, collapse = "\n") > >> evaluate::evaluate(input = bar) > > [[1]] > > $src > > [1] "foo <- function(x) {\n print(x)\n}\nprint)foo)\nfoo(2)" > > > > attr(,"class") > > [1] "source" > > > > [[2]] > > <simpleError: <text>:4:6: unexpected ')' > > 3: } > > 4: print) > > ^> > > > > I ran into the same problem as source(): it works only if it doesn't have > > any errors. In addition, the error message is also different because it > > evaluates the entire chunk, whereas the R console evaluates one command > > (line) at a time. > > > > Fixing the command: > > bar2 <- "foo <- function(x) {\n print(x)\n}\nprint(foo)\nfoo(2)" > > > > will fix the workflow in evaluate(): > > > > evaluate::evaluate(input = bar2) > > > > > > But it will also fix it with source(): > > > >> source("foo2.R", echo = TRUE, keep.source = TRUE) > > > >> foo <- function(x) { > > + print(x) > > + } > > > >> print(foo) > > function(x) { > > print(x) > > } > > > >> foo(2) > > [1] 2 > > > > > > So evaluate() has more detail than source(), but essentially they do the > > same thing in evaluating the whole chunk. From the help of source(): > > "Since the complete file is parsed before any of it is run, syntax errors > > result in none of the code being run." > > > > So far, it seems that only R CMD BATCH is able to run one command at a > time: > > > > $ R CMD BATCH -q foo.R > > $ cat foo.Rout > >> foo <- function(x) { > > + print(x) > > + } > >> print)foo) > > Error: unexpected ')' in "print)" > > Execution halted > > > > This error is exactly the same as in the R console, and the function > foo() > > is created before the error occurs. One possible solution is to get the > > workspace saved, and run R CMD BATCH again on the rest of commands after > the > > error. > > > > But it still needs additional objects if the chunk is to be evaluated in > a > > specific environment. This is the point where I've got, and I don't know > if > > this is the best approach. > > > > Thank you, > > Adrian > -- Adrian Dusa University of Bucharest Romanian Social Data Archive Soseaua Panduri nr.90 050663 Bucharest sector 5 Romania [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.