【问题标题】:R: piping (%>%) not working with round(). Ex: 136/13.00 %>% round() = 10.46154R:管道(%>%)不适用于round()。例如:136/13.00 %>% round() = 10.46154
【发布时间】:2017-10-06 08:11:18
【问题描述】:

为什么136/13.00 %>% round() 返回 10?没有 piper 的相同输入返回正确的值

136/13.00 %>% round()
[1] 10.46154
> round(136/13.00)
[1] 10
10.46154 %>% round()
[1] 10

【问题讨论】:

  • 试试136 %>% '/'(13) %>% round
  • 或显式指定操作顺序,如(136/13.00) %>% round()
  • 我在下面的答案中看到这是因为 %>% 优先于 /。这是一个错误还是一个功能?我没有看到管道优先于它之前的任何东西的任何逻辑。至少这不是使用 tidyverse 的人在考虑管道时的想法

标签: r rounding piping


【解决方案1】:

看起来像运算符优先级

(136/13) %>% 
          round
#[1] 10

我们也可以让它更链式

136 %>%
     `/`(13) %>%
     round
#[1] 10

【讨论】:

  • 是的。 13 在除以 136 之前被四舍五入。如果我要链接它,我会使用magrittrs 除法函数,即136 %>% divide_by(13) %>% round()
  • 这是一个功能还是一个错误(似乎我对这个问题的评论)?
  • @LucasMation 如前所述,我们需要检查运算符优先级。
【解决方案2】:

因为operator precedence%any% 运算符的优先级高于例如 /。所以 round 首先应用于 13(什么都不改变),然后 136 除以 13。

【讨论】:

    【解决方案3】:

    我想继续这个话题。当我尝试在代码的最底部使用 round 时发生错误。我想用双精度四舍五入:

    customers <- data_XYZ %>%
      group_by(Client) %>%
      summarise(count = n(),
                mean = mean(Cost_1, na.rm = TRUE),
                sd = sd(Cost_1, na.rm = TRUE)) %>%
      filter(.,!is.nan(sd)) %>%
      round([mean:sd],2)
    

    【讨论】:

    • StackOveflow 礼仪":您不应继续讨论有答案的主题。提出新问题并删除此“答案”
    最近更新 更多