【问题标题】:print list names while iterating in lapply not working in 3.2在 lapply 中迭代时打印列表名称在 3.2 中不起作用
【发布时间】:2015-05-19 15:36:59
【问题描述】:

每次通过lapply 运行函数时,我都会尝试输出列表名称。我发布了我之前发布的question earlier,@Ananda Mahto 提供的答案运行良好,直到我将R 升级到版本 3.2.0。它不再工作,我收到以下错误消息:Error in eval.parent(quote(names(X)))[substitute(x)[[3]]] : invalid subscript type 'symbol'

x <- ts(rnorm(40,5), start = c(1961, 1), frequency = 12)
y <- ts(rnorm(50,20), start = c(1971, 1), frequency = 12)
z <- ts(rnorm(50,39), start = c(1981, 1), frequency = 12)
a <- ts(rnorm(50,59), start = c(1991, 1), frequency = 12)

dat.list <- list(x=x,y=y,z=z,a=a)

abc <- function(x) {
  r <- mean(x)
  print(eval.parent(quote(names(X)))[substitute(x)[[3]]])
  return(r)
}

forl <- lapply(dat.list, abc)

我不确定是什么问题,但我检查了R 新版本中的所有语法,没有任何改变。任何帮助是极大的赞赏。我也乐于接受任何新想法。

【问题讨论】:

    标签: r loops lapply


    【解决方案1】:

    稍微重构一下,就可以得到同样的效果,外观更简单:

    set.seed(42)
    ## using your dat.list construction code from above
    abc <- function(x) { r <- mean(x); return(r); }
    
    forl <- mapply(function(n, x) {
            message(n)
            abc(x)
        }, names(dat.list), dat.list, SIMPLIFY=FALSE)
    ## x
    ## y
    ## z
    ## a
    
    forl
    ## $x
    ## [1] 4.960464
    ## $y
    ## [1] 20.1141
    ## $z
    ## [1] 38.87175
    ## $a
    ## [1] 58.89825
    

    我假设你想要 list 中的输出,而不是 vector,因此 SIMPLIFY=FALSE 模仿 lapply。否则,它是一个更简单的向量。

    它不是通用的,因为您必须显式传递名称和 dat,但您可以创建一个三明治函数,代价是必须重新实现 lapply 功能。

    我在这里使用的个人编码偏好是使用message 而不是print。基本原理是用户可以选择使用suppressMessages(在mapply 之外,假设它可以/将被埋在一个函数中),而抑制print 调用的输出则需要更多的工作。

    【讨论】:

    • 太棒了,谢谢。与我的问题中概述的方法相比,您的方法很快。知道为什么会这样吗?非常感谢。
    • 如果我不得不猜测,也许是因为我没有处理任何东西来确定要打印的字符串。但我没有分析它,所以我不确定。很高兴听到它对您有用。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2013-02-19
    • 2011-04-05
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多