如何将用户定义函数中的参数变量传递给r中的子函数

时间:2014-04-22 20:56:09

标签: r user-defined-functions paste cat

我在理解如何创建用户定义函数时遇到了一般性问题,该函数可以接受变量作为可以在定义函数内操作的参数。我想创建一个函数,我可以将变量作为参数传递给内部函数进行操作。似乎我想要使用的许多函数都需要c()运算符,它需要在参数周围引用。

所以我的函数必须能够将数据框中的变量名称传递给c()的引号和需要引用字符串的其他函数。我在paste0pastecat(x)上阅读了很多帖子,但我无法弄清楚如何彻底解决我的问题。

这是一个简单的数据集和缩短的代码,以帮助解决问题。在这里,我只想提供一个数据帧和三个变量。该函数应为xz变量的每个组合提供y位置变量的均值。生成的聚合表应该具有作为列标题作为XTABAR参数提供的变量的名称。

n=50
DataTest = data.frame(  xcol=sample(1:3, n, replace=TRUE), ycol = rnorm(n, 5, 2), Catg=letters[1:5])

XTABAR<- function(DS,xcat,yvar,group){ 
  library(plyr)
  #library(ggplot2)
  #library(dplyr)
  #library(scales)
  localenv<-environment()
  gg<-data.frame(DS,x=DS[,xcat],y=DS[,yvar],z=DS[,group] )
  cnames<-colnames(gg)
  ag.gg<-aggregate(gg$y, by=list(gg$x,gg$z),FUN=mean)

  colnames(ag.gg)<-c(cat('"',cnames[1],'"'),cat('"',cnames[2],'"'),cat('"',cnames[3],'"'))
  return(ag.gg)
}

XTABAR(DataTest,"xcol","ycol","Catg")

这段代码尽可能地解决了这个简单的问题。我不知道如何从列名中删除引号,也不知道如何去除NA。

感谢您对逻辑和/或代码的任何帮助。

3 个答案:

答案 0 :(得分:1)

尝试以下方法。我不太清楚引用这些名字的愿望,但我们在下面的代码中放置了星星。如果不需要,请删除setNames语句。

XTABAR <- function(DS, xcat, yvar, group) {
    ag <- aggregate(DS[yvar], DS[c(xcat, group)], mean)
    setNames(ag, paste0("*", names(ag), "*"))
}

测试它:

XTABAR(DataTest, "xcol", "ycol", "Catg")

,并提供:

   *xcol* *Catg*   *ycol*
1       1      a 5.700938
2       2      a 5.292628
3       3      a 5.204395
4       1      b 4.054289
5       2      b 5.119659
6       3      b 4.050799
7       1      c 2.937309
8       2      c 5.696256
9       3      c 6.773029
10      1      d 5.323572
11      2      d 3.430644
12      3      d 4.892041
13      1      e 4.024070
14      3      e 5.038122

答案 1 :(得分:0)

为此,我大量使用eval(parse(text=))。它评估字符串,就像它是一个命令一样。例如:

> x <- "5 + 5"
> eval(parse(text=x))
[1] 10

使用您的示例,如果您将参数输入为字符串,这应该可以使用:

XTABAR<- function(DS,xcat,yvar,group){ 
  library(plyr)
  #library(ggplot2)
  #library(dplyr)
  #library(scales)

  var1 <- eval(parse(text=paste(DS, "$", xcat, sep="")))
  var2 <- eval(parse(text=paste(DS, "$", yvar, sep="")))
  var3 <- eval(parse(text=paste(DS, "$", group, sep="")))

  localenv<-environment()
  gg<-data.frame(x=var1, y=var2, z=var3)
  cnames<-colnames(gg)
  ag.gg<-aggregate(gg$y, by=list(gg$x,gg$z),FUN=mean)

  colnames(ag.gg)<-c(cat('"',cnames[1],'"'),cat('"',cnames[2],'"'),cat('"',cnames[3],'"'))
  return(ag.gg)

}

我会继续前进,并期待批评我的回答。

> require(fortunes)
Loading required package: fortunes
> fortune(106)

If the answer is parse() you should usually rethink
the question.
   -- Thomas Lumley
      R-help (February 2005)

先生。在这种情况下,Lumley可能是正确的。可能有更简单的解决方案,但这至少应该让你前进。

答案 2 :(得分:0)

要设置列名称,请使用colnames(ag.gg) <- c(xcat, yvar, group)