对lapply中的多个参数进行递增

3

有没有一种方法可以在 lapply 函数中递增两个参数?例如:

test <- function(pos,value){
   list[pos,value]
}

data=c(1,4,32,54) #not global
lapply(X=1:length(data),test, value=data[X])#this is the idea but the code doesnt work

输出结果将为list(list(1,1),list(2,4),list(3,32),list(4,54)) 另一个例子是:
test <- function(pos,value,value2){
   list(pos,value,value2)
}

data=c(1,4,32,54) #not global
data2=c(2,6,3,21) #not global
lapply(X=1:length(data),test, value=data[X], value2=data2[X]) #this is the idea but the code doesn't work


输出结果将是list(list(1,1,2), list(2,4,2), list(3,32,6), list(4,54,21))。 这也许会有所帮助。我正在尝试将for循环转换成lapply。
test <- function(pos,value,value2){
   list(pos,value,value2)
}

data=c(1,4,32,54) #not global
data2=c(2,6,3,21) #not global
for(i:length(data)){
  result=list(result,test(i,data[i],data2[i]))
}

由于变量不是全局的,所以我不能将测试函数设置为:
test <- function(pos){
   list(pos,data[pos],data2[pos])
}

我知道有一种更简单的编写代码以实现相同功能的方法。但我正在寻找一种特定的途径来增加两个变量,或在参数中使用增加的值。示例中使用的变量不是全局的,因此我不能在函数中使用它们,而需要使用lapply函数。在代码中,lapply行不起作用,这只是为了演示我想做什么。谢谢。
编辑
所以在学习mapply函数之后,我意识到我想要创建一个类似于mapply的lapply函数。

1
data是什么类型的对象? - Sotos
1
你可以使用 MapMap(c, seq_along(data), data, data2) - Ronak Shah
@RonakShah 我需要使用lapply函数。实际上我正在做的问题略有不同,只是为了这个例子而简化了。 - Nikita Belooussov
@NikitaBelooussov 我想你是指向量...list(1, 2, 3) = 列表... c(1, 2, 3) = 向量... - Sotos
我认为你需要提供一个更好的例子,同时包括你能做和不能做的事情。 - Ronak Shah
显示剩余7条评论
3个回答

1
使用"<-"赋值运算符:
num_vec <- c(1, 4, 32, 54)

num_vec2 <- c(2, 6, 3, 21)

# Using lapply: 

lapply(seq_along(num_vec), function(x){return(c(x, num_vec[x], num_vec2[x]))})

使用"="赋值运算符:
num_vec = c(1, 4, 32, 54)

num_vec2 = c(2, 6, 3, 21)

# Using lapply: 

lapply(seq_along(num_vec), function(x){return(c(x, num_vec[x], num_vec2[x]))})

在上述情况下,赋值运算符不起作用,与局部或全局赋值无关。
针对想要根据向量中的值检索元素的额外查询的回复:
num_vec = c(1, 4, 32, 54)


num_vec2 = c(2, 6, 3, 21)

test <- function(num_vec, num_vec2, val) {
  if (!hasArg(val)) {
    val <- 1:max(c(num_vec, num_vec2))
  } else{
    as.numeric(c(val))
  }

  lapply(seq_along(num_vec),

         function(x) {
           return(c(x, num_vec[x], num_vec2[x]))
         })[ifelse(
           val %in% num_vec &

             !(val %in% num_vec2),

           which(num_vec %in% val),

           ifelse(
             !(val %in% num_vec2) &

               !(val %in% num_vec2),

             0,

             ifelse(
               val %in% num_vec &

                 val %in% num_vec2,

               c(which.min(
                 which(val %in% num_vec), which(val %in% num_vec2)
               ),

               which.max(
                 which(val %in% num_vec), which(val %in% num_vec2)
               )),

               which(val %in% num_vec2)
             )
           )
         )]

}

test(num_vec, num_vec2, 54)

是的。我要测试一下,因为我可能理解有误,但是这部分 num_vec <- c(1,4,32,54)[x],让我觉得如果 num_vec 不是全局的,那么在 lapply 中定义的函数就无法访问它。然后 num_vec[x] 就行不通了。 - Nikita Belooussov
是的。我刚刚测试了一下,似乎在我的情况下没有起作用。让我想想如何更好地编辑我的问题中的代码示例,因为我认为大多数人都难以理解我所寻找的内容。这主要是由于问题中的代码没有完全正确地展示它。 - Nikita Belooussov
你在使用我在答案中提供的示例吗? - hello_friend
如果我直接使用=,就像第二个例子一样,它不起作用,我认为这更准确地表示了我的问题。那么如果不将其更改为<-,我该怎么做呢?我使用了这个网站来运行它。https://rdrr.io/snippets/ - Nikita Belooussov
我也在那个网站上使用“=”赋值运算符运行了它,而且它成功了。 - hello_friend
显示剩余4条评论

1

我猜在你的情况下,mapplylapply更好。

假设你有可变数量的输入参数,你可以将test重写为

test <- function(pos,...){
  list(pos, ...)
}

在您的示例中输入
data=c(1,4,32,54) #not global
data2=c(2,6,3,21) #not global

使用mapply可以实现这一点:
mapply(test, seq_along(data), data, data2, SIMPLIFY = F)

是的,我认为这就是我要找的等价物。你能想到一种创建 lapply 的方法吗?它是否可以做到同样的事情? - Nikita Belooussov
根据我的有限了解,使用lapply函数时,我认为不可能对data进行索引,因为您无法跟踪迭代。@NikitaBelooussov - ThomasIsCoding

0

仅补充@hello_friend的答案,您可以使用lapply将参数传递给函数。从问题中我了解到您想要向函数传递多个参数。下面的代码尝试实现这一点,请查看。

vec1 <- c(1, 3, 5, 7)

vec2 <- c(2, 4, 6, 8)

test <- function(pos, vec_arg1, vec_arg2){
  return(c(pos, vec_arg1[pos], vec_arg2[pos]))
}
# Using lapply: 

lapply(seq_along(num_vec), test, vec1, vec2)

我认为这更接近了,但是我能否只输入该位置的值而不是整个向量? - Nikita Belooussov
不确定您的意思。但根据您的编辑,也许mapply是解决方案。 - Kumar Manglam
是的。我之前不知道mapply。现在知道了,我想要的是一个像mapply一样运作的lapply,但我猜这是不可能的。 - Nikita Belooussov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接