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 <[email protected]>
To: "[email protected]" <[email protected]>
Subject: [R] pass nrow(x) to dots in function(x){plot(x,...)}
Message-ID: <20110202115150.GD8598@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. 
______________________________________________
[email protected] 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.

Reply via email to