在函数中循环并在R中自动创建对象

在函数中循环并在R中自动创建对象,r,function,object,loops,R,Function,Object,Loops,我试图计算R中不同组的列平均值。有几种方法可以分配组,因此创建了两个包含不同组的列 # create a test df df.abcd.2<-data.frame(Grouping1=c("a","f","a","d","d","f","a"),Grouping2=c("y","y","z","z","x","x","q"),Var1=sample(1:7),Var2=sample(1:7),Var3=rnorm(1:7)) df.abcd.2 #创建一个测试d

我试图计算R中不同组的列平均值。有几种方法可以分配组,因此创建了两个包含不同组的列

    # create a test df
    df.abcd.2<-data.frame(Grouping1=c("a","f","a","d","d","f","a"),Grouping2=c("y","y","z","z","x","x","q"),Var1=sample(1:7),Var2=sample(1:7),Var3=rnorm(1:7))
    df.abcd.2
#创建一个测试df

df.abcd.2它工作得很好。阅读有关分配的帮助。了解框架和环境

换句话说,它是在函数内部创建变量,但是当您在命令行执行
ls()
时,它们不会泄漏到您看到的环境中。如果将
print(ls())
放入函数循环中,您将看到它们,但当函数结束时,它们将消失

通常,函数与其调用环境交互的唯一方式是通过其返回值。任何其他方法都将进入一个痛苦的世界


不要使用assign来创建具有顺序或信息性名称的内容。曾经除非你知道你在做什么,而你不知道。。。将它们粘贴到列表中,然后您可以为循环等部件编制索引。

它工作得很好。阅读有关分配的帮助。了解框架和环境

换句话说,它是在函数内部创建变量,但是当您在命令行执行
ls()
时,它们不会泄漏到您看到的环境中。如果将
print(ls())
放入函数循环中,您将看到它们,但当函数结束时,它们将消失

通常,函数与其调用环境交互的唯一方式是通过其返回值。任何其他方法都将进入一个痛苦的世界


不要使用assign来创建具有顺序或信息性名称的内容。曾经除非你知道你在做什么,而你不知道。。。将它们粘贴到列表中,然后您可以为循环等部件编制索引。

您确定要将结果存储在不同的对象中吗?我在这里的两分钱是用来做列表中的所有事情的。@RomanLuštrik。我是否理解你的意思,你会写一个循环来将所有结果存储在一个列表中?我试着听从你的建议,使用了plyr软件包中的dlply。所以我的函数看起来像
function.list你确定你真的想把结果存储在不同的对象中吗?我在这里的两分钱是用来做列表中的所有事情的。@RomanLuštrik。我是否理解你的意思,你会写一个循环来将所有结果存储在一个列表中?我试着听从你的建议,使用了plyr软件包中的dlply。所以我的函数看起来像
function.list
   #Loop to create the colmeans and store them in dataframes
    for (i in 1:2){
      nam <- paste("RRRRRR",deparse(i), sep=".")
      assign(nam, as.data.frame(
        lapply(
          split(df.abcd.2[,3:5], df.abcd.2[,i]), colMeans)
      )
      )
    }
    # 1. function to calculate colMeans for diffrent groups
    # df= desired datatframe, 
    # a=starting column: beginning of the columns that contain the groups, b= end of columns that contain the groups
    # c=startinc column: beginning of columns to be analized, d=end of columns do be analized

    function.split.colMeans<-function(df,a,b,c,d)
    {for (i in a:b){
      nam <- paste("OOOOO",deparse(i), sep=".")
      assign(nam, as.data.frame(
        lapply(
          split(df[,c:d], df[,i]), colMeans)
      )
      )
    }
    }
    #test the function
    function.split.colMeans(df.abcd.2,1,2,3,5)