如何通过opencpu将未知数量的参数传递给R函数?

时间:2014-09-11 18:32:23

标签: r

我有这个R功能。第一个参数是json数据对象。我将json对象转换为数据帧,然后根据给予此函数的其他参数,我根据给定的参数对数据帧进行子集化。参数可以是数据框中的所有列名称或子集名称的子集,因此它会有所不同。

转换为自定义json数据

data<-function(x, ...) {
  x<-fromJSON(x)
  (x <- lapply(x, function(x) { as.data.frame(x) }))
  (x <- do.call(rbind, x))
  x<-unique(x)

  cols <- c(...)
  dd<-cbind(Date=x[,1],subset(x, select=cols))
  mm <- melt(dd)
  ss <- split(mm, mm$variable)

  poo <- unname(Map(function(n,x) 
    list(name=n, data=unname(lapply(split(x, 1:nrow(x)), function(x) {
      list(x$Date, x$value)
    }))), names(ss),ss))
  p<-toJSON(poo)
  return(p)
}

我的问题是这个。给定一个可以使用不同数量参数的函数,如何引用参数?

例如,我有这个数据drame:

structure(list(DateTime = structure(1:8, .Label = c("8/24/2014 15:20", 
"8/24/2014 15:55", "8/24/2014 16:04", "8/24/2014 16:18", "8/24/2014 16:27", 
"8/24/2014 16:42", "8/24/2014 16:56", "8/24/2014 17:10"), class = "factor"), 
    Server1 = c(6.09, 4.54, 5.03, 4.93, 6.27, 4.59, 5.91, 4.53
    ), Server2 = c(5.7, 4.38, 4.52, 4.61, 4.18, 4.61, 4.37, 4.3
    ), Server3 = c(5.21, 5.33, 4.92, 5.56, 5.62, 6.73, 4.76, 
    4.59)), .Names = c("DateTime", "Server1", "Server2", "Server3"
), row.names = c("DateTime.1", "DateTime.2", "DateTime.3", "DateTime.4", 
"DateTime.5", "DateTime.6", "DateTime.7", "DateTime.8"), class = "data.frame")

我需要调用我的数据函数,

data(x, "DateTime","Server1")

可能还有一段时间:

data(x, "Datetime", "Server1", "Server2")

有没有办法传递函数参数列表?

例如:

arg_list<-c("DateTime", "Server1", "Server3")

data(x, arg_list)

1 个答案:

答案 0 :(得分:2)

这里最简单的方法是将列名称作为list传递。然后,您可以编写该函数,以便无论列表中有多少元素都可以使用,您甚至可以测试列表NA并对其做出适当的响应。

关于传递参数的问题,参数可以以列表的形式传递给函数。这适用于do.call例如:

 PlottList<-list(x=rnorm(10), y=rnorm(10), col="red",pch=16, xlab="X",ylab="Y")
 do.call(plot, PlotList)

如果你想传递一些命名参数并将它们与你可以做的列表结合起来:

  PlottList2<-list( y=rnorm(10), col="red",pch=16, xlab="X",ylab="Y")
   do.call(plot,c(list(x=rnorm(10)),PlotList2))

请注意x不在PlotList2。它表示您在do.call函数中组合的名称参数。如果您将参数作为list传递并使用do.call,那么您不需要提前知道所有参数,当然,假设最终会将w传递给函数认出他们。如果您希望一组表示为...的未知参数转到一个函数而另一组转到另一个函数,这会很有用,