【问题标题】:How to pass variables that are arguments in user defined functions to subfunctions in r如何将作为用户定义函数中的参数的变量传递给 r 中的子函数
【发布时间】:2014-06-07 10:39:21
【问题描述】:

我在理解如何创建一个用户定义的函数时遇到一个普遍的问题,该函数可以接受变量作为可以在定义的函数内部进行操作的参数。我想创建一个函数,我可以在其中将变量作为参数传递给内部函数进行操作。看来我想使用的许多函数都需要 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。

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

【问题讨论】:

  • 如果不进一步研究这个函数的作用 - colnames(ag.gg)&lt;-c(xcat, yvar, group) 呢?
  • lukeA,你解决了我的临时问题,谢谢。我是stackoverflow的新手。我如何给你信用?
  • 那么欢迎来到 SO。 :) 投票柜台旁边有一个复选标记。如果您找到您喜欢的解决方案,您可以通过单击复选标记来接受它作为答案。 PS:阅读stackoverflow.com/questions/5963269/…提供好的例子并获得更多答案。

标签: r user-defined-functions paste cat


【解决方案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

【讨论】:

  • 谢谢。我没有足够的代表点数来投票,但这很管用。
【解决方案2】:

为此我大量使用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 可能是正确的。可能有更简单的解决方案,但这至少应该让你继续前进。

【讨论】:

  • 不幸的是,解析解决方案不起作用。不过谢谢。我从财富包下载了pdf。谢谢大家
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多