应用将列表返回到R中的向量的任意函数

应用将列表返回到R中的向量的任意函数,r,R,我最近问了一个类似的问题(),但我给出的例子有点太简单了,答案不适合我的实际用例。同样,我在使用R,并且想对向量应用一个函数。函数返回一个列表,我希望将结果格式化为向量列表,其中输出列表的名称对应于函数返回的列表中的名称,每个列表元素的值是输入向量元素上的值向量。以下示例显示了一个基本设置,以及计算所需输出的两种方法(sum.of.differences和sum.of.differences.2)。第一种方法(sum.of.differences)似乎是理解所需输出的最简单方法;第二种方法(su

我最近问了一个类似的问题(),但我给出的例子有点太简单了,答案不适合我的实际用例。同样,我在使用R,并且想对向量应用一个函数。函数返回一个列表,我希望将结果格式化为向量列表,其中输出列表的名称对应于函数返回的列表中的名称,每个列表元素的值是输入向量元素上的值向量。以下示例显示了一个基本设置,以及计算所需输出的两种方法(
sum.of.differences
sum.of.differences.2
)。第一种方法(
sum.of.differences
)似乎是理解所需输出的最简单方法;第二种方法(
sum.of.differences.2
)避免了第一种方法的两个主要问题——为输入向量的每个元素计算两次函数,并被迫显式给出列表元素的名称。然而,对于这样一项基本任务,第二种方法似乎也相对复杂。有没有更惯用的方法在R中获得所需的结果

x <- rnorm(n = 10)
a <- seq(from = -1, to = +1, by = 0.01)

sum.of.differences.fun <- function(a) {
  d <- x - a
  list(
    sum.of.absolute.differences = sum(abs(d)),
    sum.of.squared.differences = sum(d^2)
  )
}

sum.of.differences <- list(
  sum.of.absolute.differences = sapply(
    X = a,
    FUN = function(a) sum.of.differences.fun(a)$sum.of.absolute.differences
  ),
  sum.of.squared.differences = sapply(
    X = a,
    FUN = function(a) sum.of.differences.fun(a)$sum.of.squared.differences
  )
)

sum.of.differences.2 <- (function(lst) {
  processed.lst <- lapply(
    X = names(lst[[1]]),
    FUN = function(name) {
      sapply(
        X = lst,
        FUN = function(x) x[[name]]
      )
    }
  )
  names(processed.lst) <- names(lst[[1]])
  return(processed.lst)
})(lapply(X = a, FUN = sum.of.differences.fun))

x你以前学过什么语言?看起来您可能正在使用来自不同函数语言(我猜是Lisp)的设计模式。就我所知,下面的代码要简单得多,输出是相同的(除了名称)


x你是对的——我对R的经验有限,毫无疑问,我使用的是我更广泛使用的其他语言(如Lisp)的风格。对于在哪里学习好的R风格,你有什么建议吗?你的版本更干净,但对我来说不太合适。(我的例子可能很简单。)问题是,我的函数比我在问题中给出的函数复杂得多,也昂贵得多。为了避免重复工作,计算函数返回的列表是相对有效的。修改你的答案意味着牺牲效率的提高。我认为这是风格和编程技术的极好来源。我并没有真正关注效率较低的地方;事实上,使用您发布的示例,我的示例的速度几乎是您的两倍:sum.of.differences需要680美元,sum.of.differences.2需要500美元,我的版本需要320美元。您示例中的问题是,在这两种情况下,您都执行了大量冗余计算。这些方法的效率几乎比我的低。也许你可以提供一个更接近真实情况的例子?@Stirling我强烈推荐-这是对基本R概念和效率的一个很好的介绍。我更新了我的第二种方法,通过计算差分向量d,使之更真实