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