[R] pass nrow(x) to dots in function(x){plot(x,...)}

rex.dwyer at syngenta.com rex.dwyer at syngenta.com
Fri Feb 4 18:06:19 CET 2011


Hi Marianne,
The quick-and-dirty solution is to add one character and make ns global:
ns <<- nrow(x)
Poor practice, but OK temporarily if you're just debugging.

This is an issue of "scope".  You are assuming dynamic scope, whereas R uses static scope.  'ns' was not defined when you said paste("n=",ns); it doesn't matter what its value is later.  Even though R delays evaluation of the argument until it is first needed, if it ends up being evaluated, the result is the same as if you evaluated it in the environment where it appeared in the text.  You can do something like this:

myfun <- function(x, title.fun, ...) {
      ns <- nrow(x)
      title = title.fun(ns)
      barplot(x , main=title, ... ) }

myfun(m1, title.fun=function(n) paste("n = ",n) )

Then the paste isn't evaluated until title.fun is *called*.  If you don't want to always supply title.fun, you give a default:
myfun <- function(x, title.fun=paste, ...) { ...
or
myfun <- function(x, title.fun=function(...){""}, ...) { ...
or
myfun <- function(x, title.fun=function(...){main}, main="", ...) { ...     # (I think)


Rex

-----------------------
Message: 4
Date: Wed, 2 Feb 2011 11:51:50 +0000
From: Marianne Promberger <marianne.promberger at kcl.ac.uk>
To: "r-help at r-project.org" <r-help at r-project.org>
Subject: [R] pass nrow(x) to dots in function(x){plot(x,...)}
Message-ID: <20110202115150.GD8598 at lauren>
Content-Type: text/plain; charset=us-ascii

Dear Rers,

I have a function to barplot() a matrix, eg

myfun <- function(x, ...) { barplot(x , ... )}

(The real function is more complicated, it does things to the matrix first.)

So I can do:

m1 <-  matrix(1:20,4)
myfun(m1)
myfun(m1, main="My title")

I'd like to be able to add the number of rows of the matrix passed to
the function to the "..." argument, eg

myfun(m1, main=paste("n=",ns))

where 'ns' would be nrow(m1)

I've tried this but it doesn't work:

myfun <- function(x, ...) {
      ns <- nrow(x)
      barplot(x , ... ) }

myfun(m1, main=paste("n = ",ns) )

ns is not found

So, basically, how do I assign an object inside a function that I can
then access in the dots when executing the function?

Many thanks

Marianne


--
Marianne Promberger PhD, King's College London
http://promberger.info
R version 2.12.0 (2010-10-15)
Ubuntu 9.04



------------------------------



message may contain confidential information. If you are not the designated recipient, please notify the sender immediately, and delete the original and any copies. Any use of the message by you is prohibited. 


More information about the R-help mailing list