On 11-08-08 9:58 PM, thmsfuller...@gmail.com wrote:
On Mon, Aug 8, 2011 at 6:08 PM, peter dalgaard<pda...@gmail.com>  wrote:

On Aug 9, 2011, at 00:29 , Dennis Murphy wrote:

Hi:

Here are a couple of ways; there may well be better ones.

# (1)  Use the get() function:
mean_on_element=function(data, elem_name) {
   with(data, mean(get(elem_name)))
}
mean_on_element(data, 'x')

I suspect this goes belly-up if there's a column data$elem_name, though.

Given than with() is essentially evalq() which in turn is eval(quote(...),...), 
the obvious way to achieve the desired effect would be to omit quoting the 
argument and do

eval(substitute(mean(elem_name)), data)

or, to avoid unexpected variable capture:

mean_on_element<- function(data, elem_name)
   eval(substitute(mean(elem_name)), data, parent.frame())

mean_on_element(airquality, Day)

I'm trying to understand 'substitute', is there a way to visualize the
parsed tree returned by 'substitute'?

as.list() turns the top level of the tree into a list. You could recursively apply that. I don't know if there's an existing function to do so, but it's not hard to write one:

expand <- function(e) {
        if (is.name(e) || !is.language(e)) return(e)
        lapply(as.list(e), expand)
}

Duncan Murdoch


substitute(mean(x))
mean(x)
str(substitute(mean(x)))
  language mean(x)


Or rather: this allows variable capture of the same kind that with() allows:

mean_on_element(airquality, X)
[1] 0.575
with(airquality, mean(X))
[1] 0.575




# (2) Lose 'with' and use subscripting instead:
mean_on_element=function(data, elem_name) {
   mean(data[[elem_name]])
}
mean_on_element(data, 'x')

Since 'x' is quoted in the function call, you need to use code that
can convert the string 'x' to extracting the data object with name x.

HTH,
Dennis

On Mon, Aug 8, 2011 at 3:12 PM, thmsfuller...@gmail.com
<thmsfuller...@gmail.com>  wrote:
Hi All,

I want to enclose with() in a function mean_on_element. Obviously, it
is not working. The problem is how to specify the element name with a
function body. Does anybody have any suggestion? Thanks!

data=list(x=1:10)
with(data, mean(x))
[1] 5.5

mean_on_element=function(data, elem_name) {
+   with(data, mean(elem_name))
+ }
mean_on_element(data, 'x')
[1] NA
Warning message:
In mean.default(elem_name) :
  argument is not numeric or logical: returning NA


--
Tom

______________________________________________
R-help@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.


______________________________________________
R-help@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.

--
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd....@cbs.dk  Priv: pda...@gmail.com
"Døden skal tape!" --- Nordahl Grieg












______________________________________________
R-help@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.

Reply via email to