R 在生成列表时将循环转换为应用

R 在生成列表时将循环转换为应用,r,list,loops,lapply,sapply,R,List,Loops,Lapply,Sapply,我试图用apply函数而不是循环来构建R中的列表列表,但是在将工作循环转换为lappy格式时遇到了问题。请允许我进一步解释一下情况: 我在R(getDetails)中有一个函数,用于检索与我传递给该函数的参数相关联的详细信息,并在列表中返回结果。如果我向它传递一条记录,那么该函数工作得很好,我还构建了一个循环,允许我一次循环一行数据帧,并将数据帧的元素逐行传递给我的函数,该函数反过来将列表返回给列表列表的第I个元素(detailsList[[I]])。我正在试图找出如何将for循环转换为appl

我试图用apply函数而不是循环来构建R中的列表列表,但是在将工作循环转换为lappy格式时遇到了问题。请允许我进一步解释一下情况:

我在R(
getDetails
)中有一个函数,用于检索与我传递给该函数的参数相关联的详细信息,并在列表中返回结果。如果我向它传递一条记录,那么该函数工作得很好,我还构建了一个循环,允许我一次循环一行数据帧,并将数据帧的元素逐行传递给我的函数,该函数反过来将列表返回给列表列表的第I个元素(
detailsList[[I]]
)。我正在试图找出如何将for循环转换为apply函数。你能帮我吗?我已经创建了一个玩具示例,如果我可以开始工作,它将允许我将其推广到实际的
getDetails
函数

#use cars dataset for an example
data(cars)
#get number of rows
numrows<-dim(cars)[1]
#initialize empty list
detailsList<-vector("list", numrows)

#This is a toy example of the loop I want to convert to an apply
#I'm having trouble because this builds up a list and returns the results
#to my detailsList one element at a time and I'm not sure how to do this 
#in an apply.
for (i in 1:numrows){
  detailsList[[i]]<-getDetails(cars[i,])
}

detailsList

getDetails<-function(parameters){
   valueA<-parameters[1]+45
   valueB<-parameters[1]+10
   list(valueA, valueB)
}
#以cars数据集为例
数据(汽车)
#获取行数

numrows我想我是在@Parfait(谢谢,@Parfait!)的一点帮助下才明白这一点的。如果有其他人在寻找答案,这对我来说很有效,但我欢迎任何其他答案:

lapply(1:numrows, function(i)  getDetails(cars[i,]))
我必须修改我的函数以返回向量而不是列表:

getDetails<-function(parameters){
   valueA<-parameters[1]+45
   valueB<-parameters[1]+10
   c(valueA, valueB)
}

getDetails我想我是在@Parfait(谢谢,@Parfait!)的一点帮助下才明白这一点的。如果有其他人在寻找答案,这对我来说很有效,但我欢迎任何其他答案:

lapply(1:numrows, function(i)  getDetails(cars[i,]))
我必须修改我的函数以返回向量而不是列表:

getDetails<-function(parameters){
   valueA<-parameters[1]+45
   valueB<-parameters[1]+10
   c(valueA, valueB)
}

getDetails这是使用
vapply编写的循环

out <- vapply(1:nrow(cars), 
              function (i) {
                valA <- .subset2(cars, 1)[i] + 45L
                valB <- .subset2(cars, 1)[i] + 10L
                c(valA, valB)
              }, numeric(2))
t(out) 
#       [,1] [,2]
# [1,]   49   14
# [2,]   49   14
# [3,]   52   17
# [4,]   52   17
# [5,]   53   18
# [6,]   54   19
# [7,]   55   20
# ...
# (returns an array instead of a list, but that can be changed easily).

这是用
vapply

out <- vapply(1:nrow(cars), 
              function (i) {
                valA <- .subset2(cars, 1)[i] + 45L
                valB <- .subset2(cars, 1)[i] + 10L
                c(valA, valB)
              }, numeric(2))
t(out) 
#       [,1] [,2]
# [1,]   49   14
# [2,]   49   14
# [3,]   52   17
# [4,]   52   17
# [5,]   53   18
# [6,]   54   19
# [7,]   55   20
# ...
# (returns an array instead of a list, but that can be changed easily).

注意:(只是隐藏的)。谢谢,@parfait。我知道apply函数和循环是一样的,但这就是为什么我要把我的循环转换成apply,问题是,在这个例子中,我不知道如何去做,因为我在循环中构建了一个列表,而且我以前从未真正使用过apply函数,尽管我过去使用apply函数没有任何困难(因为我没有在循环中构建列表)。我更新了我的回答,一开始我认为是正确的,但似乎它在列表中添加了第三个维度。第三个元素?函数返回列表中的两个元素。假设值对象是单项向量,尝试将
list()
替换为
c()
。啊,是的。很抱歉我是说第二个。这就是我使用玩具示例并将其应用到实际工作中所得到的结果(实际工作中有第三个元素)。我已经更新了更新。我将尝试使用c()而不是list。谢谢你的建议@冻糕,你就是男人(或女人)!非常感谢你的帮助。在我的函数末尾只使用c()而不是list(),这样做了。非常感谢!注意:(只是隐藏的)。谢谢,@parfait。我知道apply函数和循环是一样的,但这就是为什么我要把我的循环转换成apply,问题是,在这个例子中,我不知道如何去做,因为我在循环中构建了一个列表,而且我以前从未真正使用过apply函数,尽管我过去使用apply函数没有任何困难(因为我没有在循环中构建列表)。我更新了我的回答,一开始我认为是正确的,但似乎它在列表中添加了第三个维度。第三个元素?函数返回列表中的两个元素。假设值对象是单项向量,尝试将
list()
替换为
c()
。啊,是的。很抱歉我是说第二个。这就是我使用玩具示例并将其应用到实际工作中所得到的结果(实际工作中有第三个元素)。我已经更新了更新。我将尝试使用c()而不是list。谢谢你的建议@冻糕,你就是男人(或女人)!非常感谢你的帮助。在我的函数末尾只使用c()而不是list(),这样做了。非常感谢!谢谢你,内特。“循环”必须发生,因为我必须一次一个地在外部3d party应用程序中查找详细信息。这只是一个玩具示例,可以帮助我找出如何在更复杂的程序中实现。谢谢你的帮助!谢谢你,内特。“循环”必须发生,因为我必须一次一个地在外部3d party应用程序中查找详细信息。这只是一个玩具示例,可以帮助我找出如何在更复杂的程序中实现。谢谢你的帮助!