【问题标题】:r expression works in ddply() in R, but not in shiny markdownr 表达式在 R 中的 ddply() 中有效,但在闪亮的降价中无效
【发布时间】:2016-08-29 20:44:10
【问题描述】:

我遇到了一个我无法解决的奇怪问题。

以下代码在 R studio 中运行良好:

> set.seed(12345)
> 
> library(plyr)
> library(dplyr)
> 
> dt <- data.frame(a=1:10, b=sample(1:3, 10, replace=T))
> 
> var <- "a"
> formula <- parse(text=paste0(var, "+1"))[[1]]
> 
> print(dt)
    a b
1   1 3
2   2 3
3   3 3
4   4 3
5   5 2
6   6 1
7   7 1
8   8 2
9   9 3
10 10 3
> 
> # this works in R Studio, but not in markdown
> res <- dt %>%
+     ddply(.(b), transform, diff = eval(formula))
> print(res)
    a b diff
1   6 1    7
2   7 1    8
3   5 2    6
4   8 2    9
5   1 3    2
6   2 3    3
7   3 3    4
8   4 3    5
9   9 3   10
10 10 3   11

当我在 R markdown 中运行相同的代码时,我收到一条错误消息,提示

Error: arguments imply differing number of rows: 2, 0

这里发生了什么?这是我的降价代码:

---
title: "Untitled"
author: "Author"
date: "8/29/2016"
output: html_document
runtime: shiny
---

```{r}
set.seed(12345)

library(plyr)
library(dplyr)

dt <- data.frame(a=1:10, b=sample(1:3, 10, replace=T))

formula <- parse(text=paste0("a", "+1"))[[1]]

#this does work in R, but not in markdown
res <- dt %>%
    ddply(.(b), transform, diff = eval(formula))
res


```

谢谢

【问题讨论】:

  • 无法复制。我机器上的结果和上面介绍的一样。
  • 您是否运行了 Markdown 文档中的最后一段代码?代码在 r studio 中运行,而不是在 r markdown 中。
  • @chungkim721 我把你的代码保存到文件中,在 RStudio 中使用rmarkdown::run 运行这个东西,并且能够通过 Chrome 中的 localhost 访问该应用程序。您是否部署在服务器上,或者您所说的“in r markdown”到底是什么意思?
  • 这看起来像是一个闪亮的运行时错误。 rmarkdown 工作正常。
  • 如果您使用eval(parse(...)),通常有更好的方法。见fortunes::fortune(106)

标签: r plyr r-markdown


【解决方案1】:

感谢那些对我的帖子发表评论的人。

首先,我不确定为什么@nilsole 能够很好地运行代码的 r markdown 部分,而我不能。我在我公司的服务器上运行了降价,所以也许它与我们的服务器有关?我完全缺乏这方面的知识,使我什至无法猜测原因可能出在哪里。

其次,这是我们在联系 RStudio 时收到的 Winston Chang 的回复。

抱歉,我不知道问题的确切原因。它看起来像 闪亮的运行时正在对 ddply 和 变换没想到。两者都使用非标准评估 他们的论点,当与 eval 结合时,结果是 不可预料的。我不完全清楚在哪个环境中 eval() 将运行。这将起作用,因为该函数捕获 调用环境:ddply(dt, .(b), function(x) { mutate(x, diff = eval(f)) })

一般来说,坚持使用 dplyr 及其版本会更安全 使用参数的标准评估的函数。例如:dt %>% group_by(b) %>% mutate_(diff = "a+1")

他们的两个建议都解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多