[R] use name (not values!) of a dataframe inside a funktion

PIKAL Petr petr.pikal at precheza.cz
Fri Feb 1 09:32:03 CET 2013


Hi

Maybe others can help you but here is my comment. I already use R for many years and never used such construction. Objects in global environment shall not be modified by functions it is a bad practice. Imagine you have some data frame you prepared and controlled in many steps and use some function from a package. 

If this function scrambles object without warning and the result cannot be easily repaired I would be tempted to curse the function with many nasty four letter words.

When I want to change some data by a function I use

fff <- function(x, no=2) {
x[,no]<-factor(x[, no])
x
}
 
dfb.f <- fff(dfb)

In this case I will end with old object dfb and new object dfb.f. Of course it is possible to use

dfb <- fff(dfb)

and in this case dfb object is changed

Petr

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of Winfried Moser
> Sent: Thursday, January 31, 2013 3:35 PM
> To: r-help
> Subject: [R] use name (not values!) of a dataframe inside a funktion
> 
> Dear Listers,
> 
> can anyone help me, please.
> 
> Since several days i try to figure out, how to assign values, vectors,
> functions etc to variables with dynamically generated names inside of
> functions.
> Sometimes I succeed, but the success is rather arbitrary, it seems. up
> to now i don't fully understand, why things like get, assign, <<- etc
> do sometimes work, and sometimes not.
> 
> here's one of my daily examples, i am stuck with: Example 1 does work,
> but example 2 doesn't?
> How kann i tell R, that i want it to expand the string "dfb" to
> "dfb[,2]"
> inside the function.
> In the end i want the function to change the second variable of the
> dataframe dfb permanently to factor (not just inside the function).
> 
> Thanks in advance!
> 
> Winfried
> 
> 
> Example 1:
> dfa <- data.frame(a=c(1:4),b=c(1:4))
> dfa[,2] <- factor(dfa[,2])
> is.factor(dfa[,2])
> >TRUE
> 
> Example 2:
> dfb <- data.frame(a=c(1:4),b=c(1:4))
> f.fact <- function(x) {x[,2] <<- factor(x[,2])}
> f.fact(dfb)
> is.factor(dfb[,2])
> >FALSE
> 
> 
> PS: I tried a whole lot of other things like, ...
> I really don't know where to keep on searching.
> 
> 
> dfb <- data.frame(a=c(1,2,3,4),b=c(1,2,3,4))
> f.fact <- function(x) {get(x)[,2] <<- factor(get(x)[,2])}
> f.fact("dfb")
> is.factor(dfb[,2])
> > "Object 'x' nicht gefunden
> 
> dfb <- data.frame(a=c(1,2,3,4),b=c(1,2,3,4))
> f.fact <- function(x) {get(x[,2]) <<- factor(x[,2])}
> f.fact(dfb)
> is.factor(dfb[,2])
> > "Object 'x' nicht gefunden
> 
> dfb <- data.frame(a=c(1,2,3,4),b=c(1,2,3,4))
> f.fact <- function(x) {get(x)[,2] <<- factor(x[,2])}
> f.fact(dfb)
> is.factor(dfb[,2])
> > "Object 'x' nicht gefunden
> 
> dfb <- data.frame(a=c(1,2,3,4),b=c(1,2,3,4))
> f.fact <- function(x) {assign(x[,2], factor(x[,2]))}
> f.fact(dfb)
> is.factor(dfb[,2])
> > Ungültiges erstes Argument
> 
> dfb <- data.frame(a=c(1,2,3,4),b=c(1,2,3,4))
> f.fact <- function(x) {quote(x)[,2], factor(x[,2])}
> f.fact(dfb)
> is.factor(dfb[,2])
> > Unerwartetes ','
> 
> dfb <- data.frame(a=c(1,2,3,4),b=c(1,2,3,4))
> f.fact <- function(x) {
> name <- paste0(quote(x),"[,2]")
>  assign(name, factor(x[,2]))}
> f.fact(dfb)
> is.factor(dfb[,2])
> > FALSE
> 
> dfb <- data.frame(a=c(1,2,3,4),b=c(1,2,3,4))
> f.fact <- function(x) {
> name <- paste0(get(x),"[,2]")
> assign(name, factor(x[,2]))}
> f.fact("dfb")
> is.factor(dfb[,2])
> > Falsche Anzahl von Dimensionen
> 
> dfb <- data.frame(a=c(1,2,3,4),b=c(1,2,3,4))
> f.fact <- function(x) {
>  name <- paste0(x,"[,2]")
> assign(name, factor(x[,2]))}
> f.fact("dfb")
> is.factor(dfb[,2])
> > Falsche Anzahl von Dimensionen
> 
> ächz ...
> 
> 	[[alternative HTML version deleted]]



More information about the R-help mailing list