gpt4 book ai didi

R 管道 (%>%) 不适用于复制功能

转载 作者:行者123 更新时间:2023-12-03 20:27:04 31 4
gpt4 key购买 nike

我正在尝试学习管道功能(%>%)。
当试图从这行代码转换到另一行时,它不起作用。

---- R代码--原版-----

set.seed(1014)
replicate(6,sample(1:8))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 3 7 4 5 1
[2,] 2 8 4 2 4 2
[3,] 5 4 8 5 8 5
[4,] 3 1 2 1 1 7
[5,] 4 6 3 7 7 3
[6,] 6 5 1 3 3 8
[7,] 8 7 5 8 6 6
[8,] 7 2 6 6 2 4

---- R 代码 - 用管道重新编码 ----
> sample(1:8) %>%  replicate(6,.)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 7 7 7 7 7 7
[2,] 3 3 3 3 3 3
[3,] 2 2 2 2 2 2
[4,] 1 1 1 1 1 1
[5,] 5 5 5 5 5 5
[6,] 4 4 4 4 4 4
[7,] 8 8 8 8 8 8
[8,] 6 6 6 6 6 6

请注意,使用管道时,采样不起作用给我
相同的向量。

最佳答案

这是可以预料的。 replicate 需要一个表达式,但是当您按原样使用管道运算符时,您只需将调用的结果粘贴到 sample()replicate 。所以你得到 6 倍相同的结果。

您必须使用 quote() 来传递要复制的表达式而不是结果,但您不应该忘记评估该表达式的每个重复。

quote(sample(c(1:10,-99),6,rep=TRUE)) %>% 
replicate(6, .) %>%
sapply(eval)

给出:
    [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 5 2 10 10 9 2
[2,] 4 3 1 3 -99 1
[3,] 10 2 3 8 2 4
[4,] -99 1 6 2 10 3
[5,] 8 -99 1 9 4 6
[6,] 4 10 8 1 -99 8

这里会发生什么:
  • 管道发送和表达式复制而不评估它。
  • 复制复制该表达式并返回一个包含该表达式 6 倍的列表,但不对其进行评估。
  • sapply(eval) 遍历列表并执行该列表中的每个表达式。

  • 在您之前的问题中(即使用 data.frame 时),您可以这样做:
    quote(sample(c(1:10,-99),6,rep=TRUE)) %>% 
    replicate(6, .) %>%
    data.frame

    现在函数 data.frame 将强制执行表达式,但你也会得到可怕的变量名,即表达式本身。

    如果您想在此处了解有关这些问题的更多信息,则必须深入研究所谓的“惰性评估”以及管道运算符(operator)如何准确处理它。但老实说,在这种情况下,我真的看不出使用管道运算符有什么好处。它甚至更具可读性。

    根据弗兰克的评论:您可以混合使用管道和函数嵌套来避免 sapply 。但为此,您必须在代码块中包含嵌套函数,否则管道运算符将无法正确处理它:
    quote(sample(c(1:10,-99),6,rep=TRUE)) %>% {
    replicate(6, eval(.)) }

    非常有趣,但恕我直言不是很有用......

    关于R 管道 (%>%) 不适用于复制功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43282796/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com