-
Notifications
You must be signed in to change notification settings - Fork 76
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
write formula fails when formula.tools package is loaded #312
Comments
I'd say it is not really worth digging into this. Would you want to create a pull request? Maybe print an error if the package namespace is loaded or try to make it bullet proof that whatever we expect to be a formula behaves as such? Guess we someplace use # with formula.tools
> paste(df$z)
[1] "A2 + B2"
# what we currently write (and libreoffice sees as formula in the sheet)
> as.character(df$z)
[1] "structure(\"A2 + B2\", class = \"formula\")" |
I think we could try to have a Might actually be more of a problem with this package. Would probably be better to use more explicit class names like |
resolves ycphs#312
Like I've said, I don't really see why we should deal with the shenanigans of some other package modifying established base classes, but if there's some simple way to handle this, I'm not vetoing changes and it looks like you're already on it 😃 |
actually i would really recommend against adding as.character.formula() function to this package. because as JanMarvin said, it's not good to modify established base classes. formula is a very common base class. adding a as.character.formula function would cause many hard-to-find bugs in user land. The fact that formula.tools package had this as.character.formula function caused me so many bugs, this issue included, that i stripped out dependence on formula.tools altogether. i would really not like having this same problem with openxlsx. i'm happy for no action to be taken. ideally openxlsx shouldn't use 'formula' class as it clashes with the established formula class in base R. if we can't be bothered changing openxlsx to use let's say workbookFormula as jmbarbone suggested, the next best thing is a warning somewhere, else no action taken. Anything is better than adding in the trouble making as.character.formula |
unloadNamespace("openxlsx")
form <- y ~ x1 * x2
identical(
as.character(form),
openxlsx:::as.character.formula(form)
)
#> [1] TRUE Created on 2022-01-11 by the reprex package (v2.0.1) I agree that this isn't the best solution. Better would be to replace every check/use of |
Can we make it simply internal? Otherwise I fear that it's a lot of noise just for one of the many thousands of packages and even more, one I haven't heard of before today? @jmbarbone Doesn't this depend on the order of package loading? Appreciate your efforts as always! |
@JanMarvin if it's internal it won't have the warn conflicts, I believe.
The more I look I this the more I think the PR #315 should be abandoned and we should see if using |
@JanMarvin, I don't think the blame can be placed on formula.tools. It intentionally tries to alter the behaviour of the generic as.character() when applied to the usual base R 'formula' class (things like y ~ x1 + x2). This is probably a deficiency of the clunky object oriented model in R. Still, i didn't like it, so i simply stopped using formula.tools as there's just no way the package will change it, it's a crucial but bad 'feature' of that package. So the problem with openxlsx is it uses the 'formula' class, which clashes with an extremely popular base R class. If formula.tools wasn't causing a generic clash, some other package out there could. It's the same as why you should never create a package that unneccesarily override base classes such as Date or Datetime. Support quote from https://stat.ethz.ch/R-manual/R-devel/library/methods/html/className.html "Overriding a class definition in another package with the same name deliberately is usually a bad idea. Although R attempts to keep and use the two definitions (as of version 2.14.0), ambiguities are always possible. It is more sensible to define a new class that extends an existing class but has a different name." This case is worse because openxlsx's 'formula' has nothing to do with the base R formula class. |
This issue is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 7 days. |
This issue was closed because it has been stalled for 7 days with no activity. |
# openxlsx 4.2.7.1 * It's now possible to insert a hyperlinked image by passing a URL, relative or absolute file path, or mailto string to the new `address` parameter of `insertImage()`. # openxlsx 4.2.7 * Fixed warning on `dataValidation(..., type = "list")` ([#342](ycphs/openxlsx#342)) * Added optional argument to `loadWorkbook` to decide if empty/blank cells should be converted to NA_character_ (the default) or left blank as is * `saveWorkbook()` now succeeds when called after the user has set column widths for a range of columns (e.g. 1:2), saved the workbook, then set column widths for a new range that is inclusive of the previous one (e.g. 1:5) ([#493](ycphs/openxlsx#493)). ## Improvements * Improve detectDates ([#288](ycphs/openxlsx#288)) * Preserve window size and position, also `getWindowSize()` and `setWindowSize()` ([466](ycphs/openxlsx#466)) # openxlsx 4.2.6 * Fix external links ([#410](ycphs/openxlsx#410)) * Do not add unneccessary sheetPr node ([#409](ycphs/openxlsx#409)) * Add support for `namedRegion`s having dots and other special characters ([#338](ycphs/openxlsx#338)). * Add type blanks and not blanks to conditional formatting ([#311](ycphs/openxlsx#311)) # openxlsx 4.2.5 ## Fixes * `openxlsx_setOp()` now works with named list ([#215](ycphs/openxlsx#215)) * `loadWorkbook()` imports `inlineStr`. Values remain `inlineStr` when writing the workbook with `saveWorkbook()`. Similar `read.xlsx` and `readWorkbook` import `inlineStr`. * `read.xlsx()` no longer changes random seed ([#183](ycphs/openxlsx#183)) * fixed a regression that caused fonts to be read in incorrectly ([#207](ycphs/openxlsx#207)) * add option to save as read only recommended ([#201](ycphs/openxlsx#201)) * fixed writing hyperlink formulas ([#200](ycphs/openxlsx#200)) * `write.xlsx()` now throws an error if it doesn't have write permissions ([#190](ycphs/openxlsx#190)) * `write.xlsx()` now again uses the default of `overwrite = TRUE` for saving files ([#249](ycphs/openxlsx#249)) * `as.character.formula()` exported to warn about potential conflicts with other packages ([#312](ycphs/openxlsx#312), [#315](ycphs/openxlsx#315)) ## Improvements * `options()` are more consistently set in functions (see: [#289](ycphs/openxlsx#262)) * `Workbook$show()` no longer fails when called in a 0 sheet workbook([#240](ycphs/openxlsx#240)) * `read.xlsx()` again accepts `.xlsm` files ([#205](ycphs/openxlsx#205), [#209](ycphs/openxlsx#209)) * `makeHyperlinkString()` does no longer require a sheet argument ([#57](ycphs/openxlsx#57), [#58](ycphs/openxlsx#58)) * improvements in how `openxlsx` creates temporary directories (see [#262](ycphs/openxlsx#262)) * `writeData()` calls `force(x)` to evaluate the object before options are set ([#264](ycphs/openxlsx#264)) * `createComment()` now correctly handles `integers` in `width` and `height` ([#275](ycphs/openxlsx#275)) * `setStyles()` accepts `halign="justify"` ([#305](ycphs/openxlsx#305))
Describe the bug
When the formula.tools package is loaded in namespace, openxlsx writing of excel sheets that include excel formula fails. Excel complains of "we found a problem with some contents of ..."
To Reproduce
works.xlsx
error.xlsx
Likely cause
formula.tools has a as.character.formula function which changes the behaviour of as.character(formula_variable). It's caused me bugs in other places so maybe it's more a problem of just bad formla.tools package. To improve openxlsx to be more robust, we could explicitly use as.character.default in brittle places. However, if authors don't see the value in debugging this, might be good to notify users somehow of the existance of this problem?
The text was updated successfully, but these errors were encountered: