Search code examples
rflextablename-collision

Conflicting class/function "nice_table" from packages afex & rempsyc


I am trying to use the two packages afex (easy anovas) and rempsyc (easy APA formatting for tables) in my R code. Independently, both work nicely. I use rempsyc's function nice_table to create a table in APA formatting that can be exported to Word but also seen in the RStudio Viewer, like this:

nice_table function screenshot from RStudio Viewer

Once I load afex though, this function from rempsyc doesn´t show me a table anymore and instead gives me the following output:

[1] header body footer col_keys caption blanks properties 
<0 rows> (or 0-length row.names) 

To reproduce this issue, here´s a basic example based on mtcars that is also used for demonstration of rempsyc.

library(rempsyc)

nice_table(
  mtcars[1:3, ],
  title = c("Table 1", "Motor Trend Car Road Tests"),
  note = c(
    "The data was extracted from the 1974 Motor Trend US magazine.",
    "* p < .05, ** p < .01, *** p < .001"
  )
)
#this one works


library(afex)

nice_table(
  mtcars[1:3, ],
  title = c("Table 1", "Motor Trend Car Road Tests"),
  note = c(
    "The data was extracted from the 1974 Motor Trend US magazine.",
    "* p < .05, ** p < .01, *** p < .001"
  )
)
#this one gives the error above and no table is created


detach("package:afex", unload = TRUE)

nice_table(
  mtcars[1:3, ],
  title = c("Table 1", "Motor Trend Car Road Tests"),
  note = c(
    "The data was extracted from the 1974 Motor Trend US magazine.",
    "* p < .05, ** p < .01, *** p < .001"
  )
)

#still doesn´t work

As you can see, my first solution was to unload afex to make this work again, but the same error remains. Specifying the package (rempsyc::nice_table) also doesn´t work. The only way I can get the function "nice_table" to work again is to close R/RStudio completely and restart from the top.

I think the problem is within the nice function from afex that outputs a dataframe of the class nice_table (as the manual states). This somehow seems to overwrite some default method that allows the function nice_table to work.

I am basically just asking if anyone knows a way that these two packages might still work together in one script. Maybe I have missed something. Thank you in advance!


Solution

  • Edit: In the development version of rempsyc, I have now removed the nice_table class completely, so you should be able to install the new version from the r-Universe without having to use pkgload::unload in your script. The new version will find its way to CRAN eventually.

    install.packages("rempsyc", repos = c(
      rempsyc = "https://rempsyc.r-universe.dev",
      CRAN = "https://cloud.r-project.org"))
    

    Old answer

    I am the rempsyc package maintainer. Thank you for reporting this issue. I have opened an issue within the afex repository to find a solution to this colliding namespace. This will hopefully be resolved in a future version of afex.


    In the meanwhile, I provide an explanation of this issue below, as well as a workaround using pkgload::unload instead of detach, which you can use within your script for the time being.

    Workaround

    data <- mtcars[1:3, ]
    table <- flextable::flextable(data)
    class(table) <- c("nice_table", class(table))
    
    suppressPackageStartupMessages(library(afex))
    
    print(table)
    #> [1] header     body       footer     col_keys   caption    blanks     properties
    #> <0 rows> (or 0-length row.names)
    
    pkgload::unload("afex")
    
    table
    

    Created on 2024-02-22 with reprex v2.0.2


    Explanation

    The afex package has a printing method for objects of class nice_table (for the afex::nice() function), and, of course, rempsyc::nice_table() also produces an object of class nice_table.

    The specific issue is that afex:::print.nice_table() uses print.data.frame(x) on the nice_table object, but then does not return the flextable, or rather, return it invisibly, with invisible(x) (as seen on these code lines).

    I think there is nothing I can do from my side (besides giving up on the nice_table class) because afex overwrites the printing method for this class without much robustness checks to avoid this type of conflict. Hopefully we will find a solution soon.

    The workaround of pkgload::unload works because, unlike detach, it detaches the whole namespace. You can just load afex again later in the script if you need to and repeat these steps as needed.