[R] Convenience-at-the-expense-of-clarity (was: quantmod's addTA plotting functions)

From: Russ Abbott <russ.abbott_at_gmail.com>
Date: Fri, 06 May 2011 23:38:37 -0700


Thanks, Writing plot(addTA()) worked fine.

I find myself with such mixed feelings about R. After finding that addTA worked fine at the command line but not in a function, I puzzled for a long time about what kind of virtual machine structure could possibly account for that. I couldn't think of any.

It turns out that this isn't due to an R virtual machine structure. The reason addTA adds its function to the plot when run from the command line is that Jeff went to the trouble to make it do that. addTA is not intended to add a plot to an existing chart.

Yet the problem I ran into is that the addTA documentation doesn't say that. Instead it says, "addTA takes a series of values, either in a form coercible to xts or of the same length as the charted series has rows, and displays the results in either a new TA sub-window, or over/underlayed on the main price chart."

I took that to mean that when I called addTA (from anywhere) a plot would be added to an existing plot. But that's not true. On the contrary, as I now understand addTA, it's function is to return an object that when passed to plot() will then be added to an existing chart. It is not intended to add the new plot to an existing chart by itself.

That interpretation makes sense given the documentation under Value. It reads "addTA will invisibly return an S4 object of class chobTA. If this function is called interactively, the chobTA object will be evaluated and added to the current chart." (By the way, there is no documentation for chobTA--at least none that I could find.)

The implication here is that addTA is not supposed to have the side effect of adding something to an exiting chart. It is only because Jeff went to the added trouble to make addTA add its plot to an existing chart when called interactively that it does so.

This raises a larger question about R style. I frequently seem to run into conveniences that are programmed into R functions. On the one hand, it's (at least superficially) nice to have those conveniences. On the other hand, it makes it much more difficult to develop a clear intuition about how the language and its functions work. I continually find myself confused by these inconveniences because I generally assume they are part of the core functionality of the function. When they aren't it's very confusing. My preferences would be not to have those extra conveniences. I'd rather have to type a few extra keystrokes and keep my intuition about how a function works clean and simple than have a muddy intuition and save a few keystrokes. In this case, for example, if one wanted an addTA that actually added something to a plot, why not create a new function called something like plot.addTA. Then addTA would work the same way both in a function and interactively and people like me (i.e., newcomers to the library) wouldn't get confused.

I want to be clear that this isn't directed at Jeff. What Jeff did was consistent with what seems to me to be the R culture. It's convenience-at-the-expense-of-clarity that I'm finding difficult to get used to.

I find this causes problems for me when for one reason or another I have the arguments to a function wrong. I'm used to languages like Java that tell you when the arguments are wrong. In R it's so often the case that the arguments might be right (because there are so many convenient ways of passing things to functions) that the compiler can't tell you when the arguments are wrong. On a number of occasions it's taken far more time than it should to find errors of that sort. The convenience wasn't worth the wasted time.

That's my rant for today.

*-- Russ *

On Thu, May 5, 2011 at 10:13 AM, P Ehlers <ehlers_at_ucalgary.ca> wrote:

> Russ,
>
> All you have to do is replace
>
>
> addTA(GSPC.EMA.3, on = 1, col = "#0000ff")
>
> with
>
> plot(addTA(GSPC.EMA.3, on = 1, col = "#0000ff"))
>
> etc.
>
> I can sympathize with the documentation frustration, but I think
> that much of the documentation in R and in many R packages is
> actually very good. I get much more frustrated with the attempts
> at 'non-technical' explanations I find in other software. It
> does take a bit of getting used to always looking at the Value
> section and, if in doubt, checking some of the See Alsos, but
> it's worth it. I don't know quantmod very well, but even a
> cursory look at the pdf file shows that the docs are quite
> good.
>
> As Jeff points out, good documentation is not easy. More good
> examples are always better, but that's mighty time-consuming.
>
> Peter Ehlers
>
>
> On 2011-05-05 10:42, Russ Abbott wrote:
>
>> Thanks. You're right. I didn't see that. I read the ?addTA help page,
>> which (annoyingly) didn't mention that feature, but I didn't read the
>> ?TA page. (That page was mentioned as a see also, but not as a must see.)
>>
>> I don't know what it means to wrap these calls in a plot call. I tried
>> to put the addTA calls into a function and call that function from the
>> higher level function, but that didn't work either. Would you tell me
>> what it means to wrap these calls in a plot call.
>>
>> Thanks
>> /-- Russ /
>>
>> P.S. Pardon my irritation, but I continually find that many of the help
>> files assume one already knows the information one is looking for. If
>> you don't know it, the help files are not very helpful. This is a good
>> example. In fact, it's two good examples. I didn't know that I had to
>> look at another page, and I (still) don't know what it means to wrap
>> plot calls in another plot call.
>>
>>
>> On Thu, May 5, 2011 at 3:39 AM, P Ehlers <ehlers_at_ucalgary.ca
>> <mailto:ehlers_at_ucalgary.ca>> wrote:
>>
>> On 2011-05-05 0:47, Russ Abbott wrote:
>>
>> Hi,
>>
>> I'm having trouble with quantmod's addTA plotting functions.
>> They seem to
>> work fine when run from the command line. But when run inside a
>> function,
>> only the last one run is visible. Here's an example.
>>
>>
>> test.addTA<- function(from = "2010-06-01") {
>> getSymbols("^GSPC", from = from)
>> GSPC.close<- GSPC[,"GSPC.Close"]
>> GSPC.EMA.3<- EMA(GSPC.close, n=3, ratio=NULL)
>> GSPC.EMA.10<- EMA(GSPC.close, n=10, ratio=NULL)
>> chartSeries(GSPC.close, theme=chartTheme('white'),
>> up.col="black",
>> dn.col="black")
>> addTA(GSPC.EMA.3, on = 1, col = "#0000ff")
>> addTA(GSPC.EMA.10, on = 1, col = "#ff0000")
>> # browser()
>> }
>>
>>
>> When I run this, GSPC.close always appears. But only GSPC.EMA10
>> appears on
>> the plot along with it. If I switch the order of the addTA calls,
>> only GSPC.EMA3 appears. If I uncomment the call to browser()
>> neither appears
>> when the browser() interrupt occurs. I can then draw both
>> GSPC.EMA.3 and
>> GSPC.EMA10 manually, and let the function terminate. All
>> intended plots are
>> visible after the function terminates. So it isn't as if one
>> wipes out the
>> other. This shows that it's possible to get all three lines on
>> the plot, but
>> I can't figure out how to do it without manual intervention. Any
>> suggestions
>> are appreciated.
>>
>>
>> Perhaps you didn't see this NOTE on the ?TA help page:
>>

>> "Calling any of the above methods from within a function
>> or script will generally require them to be wrapped in a
>> plot call as they rely on the context of the call to
>> initiate the actual charting addition."
>>
>> Peter Ehlers
>>
>>
>> Thanks.
>>
>> *-- Russ *
>>
>> [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help_at_r-project.org <mailto:R-help_at_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.
>>
>>
>>

        [[alternative HTML version deleted]]



R-help_at_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. Received on Sat 07 May 2011 - 06:42:01 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 07 May 2011 - 07:30:05 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive