【问题标题】:Assigning a variable within a pipe and continuing?在管道中分配变量并继续?
【发布时间】:2019-02-04 02:42:46
【问题描述】:
hist(dat)
std_dev <- sd()
round(std_dev,3)

我的教授希望我们使用管道将其放入一行代码中,但是,我在分配 std_dev &lt;- sd() 并继续时遇到了问题。

尝试:

dat %T>% hist() %>% sd() %>% .->std_dev %>% round(.,3) 

.(.) 中的错误:找不到函数“.”

dat %T>% hist() %>% sd() %>% ~(.->std_dev) %>% round(,3)

不给 std_dev 分配任何东西。

dat %T>% hist() %>% sd() %>% =std_dev %>% round(,3)

意外=

dat %T>% hist() %>% sd() %>% ->std_dev %>% round(,3)

意外的'->'

【问题讨论】:

  • 教授的要求有点奇怪,为什么要把sd()函数复制到一个新名字下?有什么解释吗?
  • 我猜这只是为了教我们管道。 (renkun-ken.github.io/pipeR-tutorial/Pipe-operator/…) 这里的方法对我不起作用或者我不明白,这是我唯一能找到的分配变量并继续移动的方法。
  • 该链接指的是一个单独的包pipeR,这与人们使用magrittr 的标准管道不同。你没有直接在你的问题中指定任何包,你的教授指定了吗?
  • 最好还是坚持使用 magrittr,但是一旦我安装了 pipeR,它就可以与 "dat %T>% hist() %>>% sd() %>>% (~ std_dev) %>>% round(,3)"
  • 前 3 行代码让我们感到困惑。第二行只是将sd 复制到具有新名称的函数中。第三行完全没有意义,因为它试图舍入一个函数,而不是一个数字。我认为@derek-harding 的答案是预期的,尽管我只是省略了对std_dev 的分配。

标签: r pipe magrittr


【解决方案1】:

你很接近。

dat %T>% hist() %>% sd() %>% round(.,3) -> std_dev

不过,不要在现实世界中这样做。不太可读。

【讨论】:

  • 这根本不会产生与第一个代码块相同的效果,他似乎复制了 sd() 函数,而不是将结果分配给它。
  • 它不会产生与第一个函数相同的结果,但我很确定第一个函数被破坏了。这很好用,谢谢,赞成。
【解决方案2】:

产生您所追求的副作用的一种可能方法是使用assign,它有点冗长,但在您的第一个块中按预期工作。

library(magrittr)
dat %T>%
  hist() %T>%
  {assign(x = "std_dev", value = sd, envir = .GlobalEnv)} %>%
  std_dev() %>%
  round(3)

使用%T&gt;% 直到需要操作数据。此外,请确保使用 assign 分配给适当的环境。

这也只使用 magrittr 包中可用的管道。

注意:这可能需要更改,因为您提供的初始代码块有问题 - 没有数据传递到 round() 函数,而是您从现有 @987654326 分配的函数@。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2013-01-10
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多