Skip to content
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

[validation] alt-text: check for RMarkdown chunks with plotting commands #95

Open
zkamvar opened this issue Aug 15, 2022 · 0 comments
Open
Labels
enhancement New feature or request

Comments

@zkamvar
Copy link
Contributor

zkamvar commented Aug 15, 2022

It should be possible to spot the majority of plot-producing functions in an RMarkdown document:

  1. check for chunks that have figure options
  2. parse the code in chunks and search for the plot() or common plotters such as ggplot()
  3. warn on chunks that do not have alt and have plot parameters

Here's some example parse data for a ggplot:

getParseData(parse(text = "ggplot(mpg, aes(x = hwy, y = cty, fill = cyl)) + geom_point()"))
#>    line1 col1 line2 col2 id parent                token terminal       text
#> 51     1    1     1   61 51      0                 expr    FALSE           
#> 42     1    1     1   46 42     51                 expr    FALSE           
#> 1      1    1     1    6  1      3 SYMBOL_FUNCTION_CALL     TRUE     ggplot
#> 3      1    1     1    6  3     42                 expr    FALSE           
#> 2      1    7     1    7  2     42                  '('     TRUE          (
#> 4      1    8     1   10  4      6               SYMBOL     TRUE        mpg
#> 6      1    8     1   10  6     42                 expr    FALSE           
#> 5      1   11     1   11  5     42                  ','     TRUE          ,
#> 37     1   13     1   45 37     42                 expr    FALSE           
#> 10     1   13     1   15 10     12 SYMBOL_FUNCTION_CALL     TRUE        aes
#> 12     1   13     1   15 12     37                 expr    FALSE           
#> 11     1   16     1   16 11     37                  '('     TRUE          (
#> 13     1   17     1   17 13     37           SYMBOL_SUB     TRUE          x
#> 14     1   19     1   19 14     37               EQ_SUB     TRUE          =
#> 15     1   21     1   23 15     17               SYMBOL     TRUE        hwy
#> 17     1   21     1   23 17     37                 expr    FALSE           
#> 16     1   24     1   24 16     37                  ','     TRUE          ,
#> 21     1   26     1   26 21     37           SYMBOL_SUB     TRUE          y
#> 22     1   28     1   28 22     37               EQ_SUB     TRUE          =
#> 23     1   30     1   32 23     25               SYMBOL     TRUE        cty
#> 25     1   30     1   32 25     37                 expr    FALSE           
#> 24     1   33     1   33 24     37                  ','     TRUE          ,
#> 29     1   35     1   38 29     37           SYMBOL_SUB     TRUE       fill
#> 30     1   40     1   40 30     37               EQ_SUB     TRUE          =
#> 31     1   42     1   44 31     33               SYMBOL     TRUE        cyl
#> 33     1   42     1   44 33     37                 expr    FALSE           
#> 32     1   45     1   45 32     37                  ')'     TRUE          )
#> 38     1   46     1   46 38     42                  ')'     TRUE          )
#> 43     1   48     1   48 43     51                  '+'     TRUE          +
#> 49     1   50     1   61 49     51                 expr    FALSE           
#> 44     1   50     1   59 44     46 SYMBOL_FUNCTION_CALL     TRUE geom_point
#> 46     1   50     1   59 46     49                 expr    FALSE           
#> 45     1   60     1   60 45     49                  '('     TRUE          (
#> 47     1   61     1   61 47     49                  ')'     TRUE          )

Created on 2022-08-15 by the reprex package (v2.0.1)

We could also use the {xmlparsedata} package to get it in XML format, which will make it easier to parse within the context of this package.

That being said, there are ways this can fail:

  1. If the chunk creates a plot and does not immediately display it, then we have to consider tracking outputs or check if the output of the next chunk is the same as the assignment from the previous chunk
  2. If the above situation happens, but they do not show the plot until later.
  3. Situations that my former self created: functions that create plots as a "bonus" feature (e.g. poppr::info_table().

For situation 3, we may be able to add in keywords for use in the SYMBOL_FUNCTION_CALL parsedata to check, but it should be relatively rare (famous last words).

That also being said, we can not implement this for python code chunks at the moment because we don't know about the parsing rules.

In any case, it

@zkamvar zkamvar added the enhancement New feature or request label Aug 15, 2022
@zkamvar zkamvar changed the title alt-text validation: check for RMarkdown chunks with plotting commands [validation] alt-text: check for RMarkdown chunks with plotting commands Mar 9, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant