【问题标题】:avoid Excel implicit intersection operator when using openxlsx in R在 R 中使用 openxlsx 时避免 Excel 隐式交集运算符
【发布时间】:2021-12-02 10:55:16
【问题描述】:

我正在使用 R 中的 openxlsx 包制作一个 Excel 工作表,该工作表稍后将每天添加一行数据。

我在使用 ISERROR 和 STDEV.P 的公式时遇到问题,但不仅仅是 AVERAGE、MIN 或 MAX。 Excel 在我的公式中添加了一个隐式交集运算符 (@)。我删除了我的 ISERROR 代码,但我仍然遇到 STDEV.P 的问题

创建工作簿、wb 并将标题放入其中后,我的代码简化为:

formula1 <- "AVERAGE(E2:E32)"
formula2 <- "AVERAGE(IF(ISERROR(E2:E32),"",E2:E32))"
formula3 <- "STDEV.P(IF(ISERROR(E2:E32),"",E2:E32))"
formula4 <- "STDEV.P(E2:E34)"
writeFormula(wb, 1, x=formula1, startCol = 5, startRow = 34)
writeFormula(wb, 1, x=formula2, startCol = 5, startRow = 35)
writeFormula(wb, 1, x=formula3, startCol = 5, startRow = 36)
writeFormula(wb, 1, x=formula4, startCol = 5, startRow = 37)
writeFormula(wb, 1, x=formula5, startCol = 5, startRow = 38)
saveWorkbook(wb, file = "Log.xlsx", overwrite = TRUE)

这就是 Excel 对我的公式所做的:

formula1
What in R is the string:  AVERAGE(E2:E32)
What Excel shows:        =AVERAGE(E2:E32)             ok; works

formula2
What in R is the string:  AVERAGE(IF(ISERROR(E2:E32),"",E2:E32))
What Excel shows:        =AVERAGE(IF(ISERROR(@E2:E32),"",E2:E32))    value error in Excel

formula3
What in R is the string:  STDEV.P(IF(ISERROR(E2:E32),"",E2:E32))
What Excel shows:        =@STDEV.P(IF(ISERROR(@E2:E32),"",E2:E32))   name error in Excel

formula4
What in R is the string:  STDEV.P(E2:E34)
What Excel shows:        =@STDEV.P(E2:E34)               Name error in Excel

每个添加了 @ 的公式在 Excel 中都不起作用,无论我在 E2:E34 中是否有数据。使用 STDEV.P 的公式出现 ?NAME 错误,其他公式出现值错误。

有谁知道如何解决这个问题? 有什么我可以添加到我的 R 代码中来强制 Excel 停止添加这些 @ 的吗? 有什么方法可以更改我在 R 中的公式字符串,以便 Excel 不会出错?

感谢您提供的任何帮助。

【问题讨论】:

  • 可能是 Office 365 特定问题,因为我无法在 Office 2019 中复制 @ 符号的外观。
  • 非常感谢您的帮助,xilliam。因为我尝试了你的公式,所以我发现当涉及错误时,Excel 计算 stdev 有点不稳定。就好像我的列中有一个等于 0 的额外数据值,使我的 stdev 有点偏离。 (尽管有stdev.p,我实际上得到了示例std dev)由于新数据将仅通过RR输入到文件中(在R从我们的数据库中提取聊天日志之后)我不需要公式来调整它们Excel 本身中的值,所以我将运行 R 中的所有公式并将结果发送到 Excel 文件。
  • 啊,很好,很高兴你找到了前进的道路。

标签: r excel intersection implicit openxlsx


【解决方案1】:

我无法复制 Excel 错误以在 Excel 公式中显示 @,但您使用公式 AVERAGE(IF(ISERROR(E2:E32),"",E2:E32)) 获得 #VALUE 的原因是因为 ISERROR 需要输入单元格而不是范围。 因此,如果您将其更改为 AVERAGE(IF(ISERROR(E2),"",E2:E32)),那么它应该可以工作。

还要确保将开头和结尾的双引号 " 替换为单个 '。这是必需的,因为在您的 Excel 公式中,您使用的是 ",而 R 会认为这是字符串 " 的结尾。

如果您使用的 Excel 函数包含 .,那么您的公式应以 _xlfn. 开头,因此要使用 STDEV.P,则应为 _xlfn.STDEV.P(E2:E34)

library(openxlsx)
wb <- createWorkbook()
addWorksheet(wb, "1")

# This works
formula1 <- "AVERAGE(E2:E32)"

# This won't work (note it begins with a single ')
formula2 <- 'AVERAGE(IF(ISERROR(E2:E32),"",E2:E32))'

# This should work
formula3 <- 'AVERAGE(IF(ISERROR(E2),"",E2:E32))'

# This won't work
formula4 <- 'STDEV.P(IF(ISERROR(E2:E32),"",E2:E32))'
formula5 <- "STDEV.P(E2:E34)"

# This should work. For a Excel functions with . start with _xlfn
formula6 <- "_xlfn.STDEV.P(E2:E34)"
    
writeData(wb, 1, 1:30, startRow = 2, startCol = 5)
writeFormula(wb, 1, x=formula1, startCol = 5, startRow = 34)
writeFormula(wb, 1, x=formula2, startCol = 5, startRow = 35)
writeFormula(wb, 1, x=formula3, startCol = 5, startRow = 36)
writeFormula(wb, 1, x=formula4, startCol = 5, startRow = 37)
writeFormula(wb, 1, x=formula5, startCol = 5, startRow = 38)
writeFormula(wb, 1, x=formula6, startCol = 5, startRow = 39)
saveWorkbook(wb, file = "Log.xlsx", overwrite = TRUE)

【讨论】:

  • 感谢_xlfn. 位。这对我有点帮助! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多