【问题标题】:How do you pass unknown number of arguments to R function via opencpu?如何通过 opencpu 将未知数量的参数传递给 R 函数?
【发布时间】:2014-11-05 19:55:37
【问题描述】:

我有这个 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)
}

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

例如,我有这个数据帧:

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)

【问题讨论】:

    标签: r


    【解决方案1】:

    这里最简单的做法是将列名作为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,那么您不需要提前知道所有参数,当然假设最终将传递给识别它们的函数。如果您希望以... 表示的一组未知参数转到一个函数,另一组转到第二个函数,这会很有帮助,

    【讨论】:

    • 这很好。我只有另一个问题。当你设计你的函数时,你如何使它需要一个列表? x
    • 当然,您可以命名列表,我推荐它。如果您想将其设为可选,也可以将其设为 x&lt;-function(y,listname=NA)
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2012-01-13
    • 2014-07-07
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多