【问题标题】:Using mapply to individual elements of list使用 mapply 到列表的各个元素
【发布时间】:2019-07-07 19:19:48
【问题描述】:

我有一个清单:

ls <- list(c(a,b),c(i,j))
a<-"char1"
b<-"char2"
i<-"char4"
j<-"char5"

我需要将以下函数应用于列表的各个元素

f1<- function(x) {
  switch(x,
         "char1"=1,
         "char2"=2,
         "char3"=3
  )
}

f2 <- function(x){
  switch(x,
         "char4"=1,
         "char5"=2,
         "char6"=3
  )
}

这是我尝试过的,但出现错误

mapply(function(dat, fun) fun(dat), ls, list(f1,f2))

开关错误(x,char1 = 1,char2 = 2,char3 = 3): EXPR 必须是长度为 1 的向量

我看到switch 中的x 的长度应该是1。现在,我认为它把x 当作c(a, b)

基本上我想用x=a申请f1a,用x=b申请f1b,用f2申请f2i和@9876544342@,申请@986 @ 到 jx=j

当我在 1 个列表上尝试 1 个函数的 mapply 时,它的工作方式是正确的

mapply(function(dat, fun) fun(dat), c(a,b), list(f1))

【问题讨论】:

  • 注意ls是一个函数名,2)列表元素需要加引号或者是对象标识符。还有,dat是什么@
  • 我编辑了我的问题。我将 ls 更改为不同的变量,它仍然不起作用。我将 f1 单独映射到 c(a,b) 并且它按我想要的方式工作。 f1 应用于 a,x=a,f1 应用于 b,x=b 在 switch 中。 dat 什么都可以。我还可以定义:mapply(function(x,y)y(x) ls,list(f1,f2))
  • 你可以在控制台中复制/粘贴ls &lt;- list(c(a,b),c(i,j)) 看看它是否有效?
  • 是的,这没有什么问题。在原始问题中也包含了 a、b、c 和 d 的值

标签: r list function switch-statement mapply


【解决方案1】:

这些函数只接受一个长度为 1 的向量。所以,我们可以 Vectorize

Map(function(dat, fun) fun(dat), ls, list(Vectorize(f1), Vectorize(f2)))
#[[1]]
#char1 char2 
#    1     2 

#[[2]]
#char4 char5 
#    1     2 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2021-03-31
    • 2012-12-29
    相关资源
    最近更新 更多