【问题标题】:How can a function which prints be called repeatedly without returning the value of what was printed and without a for loop? [duplicate]如何重复调用打印的函数而不返回打印的值且没有 for 循环? [复制]
【发布时间】:2021-01-05 00:27:10
【问题描述】:

我最近写了for(i in 1:100){foo(i,bar)} 作为脚本的最后一行。在这种情况下,foo 的最后一行是对print 的调用,我绝对不想看到foo 的返回值。我只想要印刷品。这个 for 循环有效,但是在 R 中使用这样的循环感觉不习惯。有没有更惯用的方法来实现这一点? foo 必须在被调用之前单独获取每个 i in 1:100,因此 foo(1:100,bar) 将不起作用。

sapply(1:100,function(x) foo(x,bar)) 似乎更惯用,但它给了我foo 的返回值及其打印。我曾考虑使用do.call,但不得不使用as.list(1:100) 让我感到厌恶。我的替代方案是什么?

最小示例:

foo<-function(i,bar)
{
  print(paste0("alice",i,bar,collapse = ""))
}
for(i in 1:100){foo(i,"should've used cat")}
sapply(1:100,function(x) foo(x,"ugly output"))```

【问题讨论】:

    标签: r sapply


    【解决方案1】:

    您可以在 base R 中使用invisible 来抑制函数返回输出:

    invisible(sapply(1:5, function(x) foo(x, "ugly")))
    
    [1] "alice1ugly"
    [1] "alice2ugly"
    [1] "alice3ugly"
    [1] "alice4ugly"
    [1] "alice5ugly"
    

    您也可以使用purrr::walk - 就像sapply 一样,它在迭代值上执行一个函数,但默认使用invisible 包装:

    purrr::walk(1:100, ~foo(., "ugly"))
    

    【讨论】:

    • 我是否认为没有包就没有惯用的方法来做到这一点?我对 tidyverse 很熟悉,但没想到会因为如此琐碎的事情而需要它。
    • 查看更新 - 还有invisible
    • 你能澄清一下你所说的“惯用语”是什么意思吗?代码美学是主观的,所以它可能有助于突出你所追求的(例如简洁、清晰、独立于包)。
    猜你喜欢
    • 2018-02-04
    • 2018-08-28
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2015-12-29
    • 2015-06-12
    相关资源
    最近更新 更多