Как передать переменные, которые являются аргументами в пользовательских функциях, в подфункции в r

У меня есть общая проблема с пониманием того, как создать пользовательскую функцию, которая может принимать переменные в качестве аргументов, которыми можно манипулировать внутри определенной функции. Я хочу создать функцию, в которой я могу передавать переменные в качестве аргументов внутренним функциям для манипуляций. Похоже, что многие из функций, которые я хочу использовать, требуют оператора c(), который требует кавычек вокруг аргументов.

Поэтому моя функция должна иметь возможность передавать имя переменной из фрейма данных в кавычки для c() и других функций, требующих строк кавычек. Я прочитал много сообщений на paste0, paste и cat(x), но не могу понять, как полностью решить мою проблему.

Вот простой набор данных и сокращенный код, которые помогут структурировать проблему. Здесь я просто хочу предоставить фрейм данных и три переменные. Функция должна предоставить среднее значение переменной в позиции y для каждой комбинации переменных x и z. Результирующая сводная таблица должна иметь имена переменных, предоставленных в качестве аргументов для 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.

Спасибо за любую помощь по логике или коду.


person RayR    schedule 22.04.2014    source источник
comment
Не вдаваясь в подробности того, что делает эта функция — как насчет colnames(ag.gg)<-c(xcat, yvar, group)?   -  person lukeA    schedule 23.04.2014
comment
lukeA, вы решили мою временную проблему, спасибо. Я новичок в stackoverflow. Как мне отдать тебе должное?   -  person RayR    schedule 23.04.2014
comment
Тогда добро пожаловать в SO. :) Рядом со счетчиком голосов есть галочка. Если вы найдете решение, которое вам нравится, вы можете принять его как ответ, нажав на галочку. PS: прочитайте stackoverflow .com/questions/5963269/, чтобы предоставить хорошие примеры и получить больше ответов.   -  person lukeA    schedule 23.04.2014


Ответы (3)


Попробуйте следующее. Я не очень четко выразил желание заключать имена в кавычки, но мы обвели их звездочками в приведенном ниже коде. Если это не нужно, удалите оператор 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
person G. Grothendieck    schedule 23.04.2014
comment
Спасибо. У меня недостаточно очков репутации, чтобы проголосовать, но это работает. - person RayR; 24.04.2014

Я активно использую 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)

Г-н Ламли, вероятно, прав в этом случае. Вероятно, есть более простые решения, но это, по крайней мере, должно вас заинтересовать.

person rsoren    schedule 22.04.2014
comment
К сожалению, решение для синтаксического анализа не сработало. Спасибо хоть. Я скачал pdf из пакета удачи. Спасибо всем - person RayR; 23.04.2014

Чтобы задать имена столбцов, используйте colnames(ag.gg) <- c(xcat, yvar, group).

person lukeA    schedule 22.04.2014