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

sasquatch: Use SAS, R, and Quarto together #673

Open
11 of 29 tasks
ryanzomorrodi opened this issue Nov 18, 2024 · 25 comments
Open
11 of 29 tasks

sasquatch: Use SAS, R, and Quarto together #673

ryanzomorrodi opened this issue Nov 18, 2024 · 25 comments
Assignees

Comments

@ryanzomorrodi
Copy link

ryanzomorrodi commented Nov 18, 2024

Submitting Author Name: Ryan Zomorrodi
Submitting Author Github Handle: @ryanzomorrodi
Other Package Authors Github handles: (comma separated, delete if none)
Repository: https://github.com/ryanzomorrodi/sasquatch
Version submitted: 0.0.0.9004
Submission type: Standard
Editor: @maurolepore
Reviewers: TBD

Archive: TBD
Version accepted: TBD
Language: en


  • Paste the full DESCRIPTION file inside a code block below:
Package: sasquatch
Title: Use 'SAS', R, and 'quarto' Together
Version: 0.0.0.9004
Authors@R: 
    person("Ryan", "Zomorrodi", , "[email protected]", role = c("aut", "cre", "cph"),
           comment = c(ORCID = "0009-0003-6417-5985"))
Description: Use R and 'SAS' within reproducible multilingual 'quarto' 
    documents. Run 'SAS' code blocks interactively, send data back and forth
    between 'SAS' and R, and render 'SAS' output within quarto documents. 'SAS'
    connections are established through a combination of 'SASPy' and 
    'reticulate'.
License: MIT + file LICENSE
Encoding: UTF-8
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.3.2
SystemRequirements: 
    python (>= 3.0.0), 
    SASPy,
    java (>= 7) required for IOM access method
Imports: 
    htmlwidgets,
    knitr,
    reticulate,
    rstudioapi
URL: https://ryanzomorrodi.github.io/sasquatch/, https://github.com/ryanzomorrodi/sasr
Suggests: 
    rmarkdown,
    testthat (>= 3.0.0)
VignetteBuilder: knitr
Config/testthat/edition: 3
BugReports: https://github.com/ryanzomorrodi/sasr/issues

Scope

  • Please indicate which category or categories from our package fit policies this package falls under: (Please check an appropriate box below. If you are unsure, we suggest you make a pre-submission inquiry.):

    • data retrieval
    • data extraction
    • data munging
    • data deposition
    • data validation and testing
    • workflow automation
    • version control
    • citation management and bibliometrics
    • scientific software wrappers
    • field and lab reproducibility tools
    • database software bindings
    • geospatial data
    • text analysis
  • Explain how and why the package falls under these categories (briefly, 1-2 sentences):

sasquatch allows users to create remote SAS sessions, work with them interactively, pass tables between R and SAS, and render quarto documents.

  • Who is the target audience and what are scientific applications of this package?

The target audience would be anyone looking to combine SAS in R within a single workflow. Using quarto, analysts can have one single reproducable report that combines SAS and R (and python potentially).

saquatch works similarly to packages like sasr or configSAS. sasr, while similar to sasquatch, does not include interactive SAS functionality or a knitr engine. On the other hand, configSAS includes a knitr engine, but no interactive SAS functionality. configSAS knitr output also does not include syntax highlighting and nested SAS output interferes with the styles of the rest of the document.

N/A

  • If you made a pre-submission inquiry, please paste the link to the corresponding issue, forum post, or other discussion, or @tag the editor you contacted.

  • Explain reasons for any pkgcheck items which your package is unable to pass.

Locally, pkgcheck is able to pass all tests except coverage. I do not currently have any coverage over the knitr engine because I am struggling to think about how I can test that effectively. My assumption that the automated pkgcheck testing will fail due to the need for python, python package SASPy, java, and a SAS License. (I have set up a CI that has all of these set up within the sasquatch repo).

Technical checks

Confirm each of the following by checking the box.

This package:

Publication options

  • Do you intend for this package to go on CRAN?

  • Do you intend for this package to go on Bioconductor?

  • Do you wish to submit an Applications Article about your package to Methods in Ecology and Evolution? If so:

MEE Options
  • The package is novel and will be of interest to the broad readership of the journal.
  • The manuscript describing the package is no longer than 3000 words.
  • You intend to archive the code for the package in a long-term repository which meets the requirements of the journal (see MEE's Policy on Publishing Code)
  • (Scope: Do consider MEE's Aims and Scope for your manuscript. We make no guarantee that your manuscript will be within MEE scope.)
  • (Although not required, we strongly recommend having a full manuscript prepared when you submit here.)
  • (Please do not submit your package separately to Methods in Ecology and Evolution)

Code of conduct

@ropensci-review-bot
Copy link
Collaborator

Thanks for submitting to rOpenSci, our editors and @ropensci-review-bot will reply soon. Type @ropensci-review-bot help for help.

@ropensci-review-bot
Copy link
Collaborator

🚀

Editor check started

👋

@ropensci-review-bot
Copy link
Collaborator

Checks for sasquatch (v0.0.0.9004)

git hash: 8353d8ac

  • ✔️ Package name is available
  • ✔️ has a 'codemeta.json' file.
  • ✔️ has a 'contributing' file.
  • ✔️ uses 'roxygen2'.
  • ✔️ 'DESCRIPTION' has a URL field.
  • ✔️ 'DESCRIPTION' has a BugReports field.
  • ✔️ Package has at least one HTML vignette
  • ✔️ All functions have examples.
  • ✔️ Package has continuous integration checks.
  • ✖️ Package coverage failed
  • ✖️ R CMD check found 1 error.
  • ✔️ R CMD check found no warnings.

Important: All failing checks above must be addressed prior to proceeding

Package License: MIT + file LICENSE


1. Package Dependencies

Details of Package Dependency Usage (click to open)

The table below tallies all function calls to all packages ('ncalls'), both internal (r-base + recommended, along with the package itself), and external (imported and suggested packages). 'NA' values indicate packages to which no identified calls to R functions could be found. Note that these results are generated by an automated code-tagging system which may not be entirely accurate.

type package ncalls
internal sasquatch 25
internal base 10
internal graphics 1
imports htmlwidgets 1
imports knitr 1
imports reticulate 1
imports rstudioapi 1
suggests rmarkdown NA
suggests testthat NA
linking_to NA NA

Click below for tallies of functions used in each package. Locations of each call within this package may be generated locally by running 's <- pkgstats::pkgstats(<path/to/repo>)', and examining the 'external_calls' table.

sasquatch

read_file (2), rstudio_context (2), sas_engine (2), check_connection (1), newline (1), r_to_sas (1), rstudio_selection (1), rstudio_text_tidy (1), sas_connect (1), sas_disconnect (1), sas_download (1), sas_get_session (1), sas_list (1), sas_remove (1), sas_run_file (1), sas_run_selected (1), sas_run_string (1), sas_to_r (1), sas_upload (1), sas_use_quarto (1), wrap_in_iframe (1), wrap_in_pre (1)

base

list (2), log (2), system.file (2), length (1), options (1), paste (1), paste0 (1)

graphics

text (1)

htmlwidgets

sizingPolicy (1)

knitr

knit_engines$set (1)

reticulate

import (1)

rstudioapi

primary_selection (1)


2. Statistical Properties

This package features some noteworthy statistical properties which may need to be clarified by a handling editor prior to progressing.

Details of statistical properties (click to open)

The package has:

  • code in R (100% in 9 files) and XML (0% in 1 files)
  • 1 authors
  • 1 vignette
  • no internal data file
  • 4 imported packages
  • 14 exported functions (median 7 lines of code)
  • 39 non-exported functions in R (median 6 lines of code)

Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
The following terminology is used:

  • loc = "Lines of Code"
  • fn = "function"
  • exp/not_exp = exported / not exported

All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the checks_to_markdown() function

The final measure (fn_call_network_size) is the total number of calls between functions (in R), or more abstract relationships between code objects in other languages. Values are flagged as "noteworthy" when they lie in the upper or lower 5th percentile.

measure value percentile noteworthy
files_R 9 52.3
files_inst 2 99.0
files_vignettes 1 61.9
files_tests 7 81.9
loc_R 238 26.0
loc_inst 30 35.4
loc_vignettes 128 31.6
loc_tests 130 42.6
num_vignettes 1 58.9
n_fns_r 53 56.9
n_fns_r_exported 14 56.1
n_fns_r_not_exported 39 58.6
n_fns_per_file_r 3 50.0
num_params_per_fn 2 8.2
loc_per_fn_r 7 16.7
loc_per_fn_r_exp 8 16.7
loc_per_fn_r_not_exp 6 14.8
rel_whitespace_R 24 36.3
rel_whitespace_inst 97 51.6
rel_whitespace_vignettes 49 43.9
rel_whitespace_tests 40 55.7
doclines_per_fn_exp 20 14.5
doclines_per_fn_not_exp 0 0.0 TRUE
fn_call_network_size 27 51.6

2a. Network visualisation

Click to see the interactive network visualisation of calls between objects in package


3. goodpractice and other checks

Details of goodpractice checks (click to open)

3a. Continuous Integration Badges

R-CMD-check.yaml

GitHub Workflow Results

id name conclusion sha run_number date
11900852065 pages build and deployment success fbd7ec 29 2024-11-18
11900828295 pkgdown.yaml success 8353d8 29 2024-11-18
11900828308 R-CMD-check.yaml success 8353d8 12 2024-11-18
11900828293 test-coverage.yaml success 8353d8 12 2024-11-18

3b. goodpractice results

R CMD check with rcmdcheck

R CMD check generated the following error:

  1. checking tests ...
    Running ‘testthat.R’
    ERROR
    Running the tests in ‘tests/testthat.R’ failed.
    Last 13 lines of output:
    5. └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    ── Error ('test-run.R:18:3'): Run SAS code from file ───────────────────────────
    Error: Python shared library not found, Python bindings not loaded.
    Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
    Backtrace:
    1. └─sasquatch::sas_connect() at test-run.R:18:3
    2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
    3. └─reticulate:::ensure_python_initialized()
      
    4.   └─reticulate:::initialize_python()
      
    5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
      

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 14 ]
Error: Test failures
Execution halted

R CMD check generated the following test_fail:

  1. This file is part of the standard setup for testthat.

It is recommended that you do not modify it.

Where should you do additional test configuration?

Learn more about the roles of various files in:

* https://r-pkgs.org/testing-design.html#sec-tests-files-overview

* https://testthat.r-lib.org/articles/special-files.html

library(testthat)
library(sasquatch)

test_check("sasquatch")
[ FAIL 12 | WARN 0 | SKIP 0 | PASS 14 ]

══ Failed tests ════════════════════════════════════════════════════════════════
── Failure ('test-connection.R:2:3'): test connection ──────────────────────────
Expected sas_connect() to run without any errors.
i Actually got a with text:
Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
── Failure ('test-connection.R:4:3'): test connection ──────────────────────────
Expected sas_connect("oda") to run without any errors.
i Actually got a with text:
Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
── Failure ('test-connection.R:6:3'): test connection ──────────────────────────
Expected sas_get_session() to run without any errors.
i Actually got a with text:
No current SAS session. Use sas_connect() to start one.
── Failure ('test-connection.R:8:3'): test connection ──────────────────────────
Expected sas_disconnect() to run without any errors.
i Actually got a with text:
No current SAS session. Use sas_connect() to start one.
── Error ('test-conversion.R:2:3'): SAS to R data.frame ────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-conversion.R:2:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-conversion.R:24:3'): R to SAS data.frame ───────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-conversion.R:24:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-io.R:12:3'): uploading files to SAS ────────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-io.R:12:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-io.R:34:3'): download files from SAS ───────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-io.R:34:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-io.R:61:3'): removing files from SAS ───────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-io.R:61:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-io.R:85:3'): listing files ─────────────────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-io.R:85:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-run.R:4:3'): Run SAS code from string ──────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-run.R:4:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

── Error ('test-run.R:18:3'): Run SAS code from file ───────────────────────────
Error: Python shared library not found, Python bindings not loaded.
Please create a default virtual environment with reticulate::virtualenv_create('r-reticulate').
Backtrace:

  1. └─sasquatch::sas_connect() at test-run.R:18:3
  2. └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. └─reticulate:::ensure_python_initialized()
    
  4.   └─reticulate:::initialize_python()
    
  5.     └─reticulate (local) python_not_found("Python shared library not found, Python bindings not loaded.")
    

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 14 ]
Error: Test failures
Execution halted

R CMD check generated the following check_fail:

  1. rcmdcheck_tests_pass

Test coverage with covr

ERROR: Test Coverage Failed

Cyclocomplexity with cyclocomp

No functions have cyclocomplexity >= 15

Static code analyses with lintr

lintr found no issues with this package!


Package Versions

package version
pkgstats 0.2.0.48
pkgcheck 0.1.2.68


Editor-in-Chief Instructions:

Processing may not proceed until the items marked with ✖️ have been resolved.

mpadge added a commit to ropensci-review-tools/pkgcheck that referenced this issue Nov 19, 2024
@emilyriederer
Copy link

Hi @ryanzomorrodi ! Thanks for your submission.

I see your README.md draws contrast with sasR and configSAS. Could you please also comment how this compares to the "native" sas language engine for R Markdown? Is it largely the interactive capabilities you mention? Or the ability to use SODA versus an on-computer executable?

(Transparently, I'm not a SAS user, so I lack some background context on this space.)

@ryanzomorrodi
Copy link
Author

ryanzomorrodi commented Nov 23, 2024

Hi @emilyriederer ,

I have never used the native sas engine. I saw the mention of it within the RMarkdown cookbook before, but frankly I can't find any other mention of someone using it in the wild. Unfortunately, I don't have access to a computer with a SAS executable installed to test it out.

One package I forgot to mention is SASmarkdown. It also relies on a local SAS executable so I haven't been able to test it out. But, it doesn't have any interactive features, there are also separate engines for output and logs (meaning you have to run your code twice to see the log), and SAS cannot interact with R at all (you need to write everything to a file and read it in the other language). This seems to be what people are currently using instead of the native engine.

One of the advantages in relying on the SASPy Python package is SASPy can connect to both local and remote SAS clients. The configuration is a bit tedious, but at least for SODA, configure_saspy() can do it for you. I was hoping that if others use it, they could share how they set up their configurations and then additional templates can be added.

@emilyriederer
Copy link

Hi @ryanzomorrodi - Thank you for your replied and your patience! I'm seeking out some editors with SAS expertise to help the process here, but will aim to get back to you soon.

@ryanzomorrodi
Copy link
Author

Sounds great! Thank you

@emilyriederer
Copy link

Hi @ryanzomorrodi - I'm happy to share that we think sasquatch is in scope. Given the necessary external dependencies like SAS it may take a bit longer to get our checks run and to identify the right editor, but more to come ASAP.

(Also, what an absolutely perfect name...)

@emilyriederer
Copy link

@ropensci-review-bot check package

@ropensci-review-bot
Copy link
Collaborator

Thanks, about to send the query.

@ropensci-review-bot
Copy link
Collaborator

🚀

Editor check started

👋

@ropensci-review-bot
Copy link
Collaborator

Checks for sasquatch (v0.0.0.9014)

git hash: b506da05

  • ✔️ Package name is available
  • ✔️ has a 'codemeta.json' file.
  • ✔️ has a 'contributing' file.
  • ✔️ uses 'roxygen2'.
  • ✔️ 'DESCRIPTION' has a URL field.
  • ✔️ 'DESCRIPTION' has a BugReports field.
  • ✔️ Package has at least one HTML vignette
  • ✔️ All functions have examples.
  • ✔️ Package has continuous integration checks.
  • ✖️ Package coverage failed
  • ✖️ R CMD check found 1 error.
  • ✔️ R CMD check found no warnings.

Important: All failing checks above must be addressed prior to proceeding

Package License: MIT + file LICENSE


1. Package Dependencies

Details of Package Dependency Usage (click to open)

The table below tallies all function calls to all packages ('ncalls'), both internal (r-base + recommended, along with the package itself), and external (imported and suggested packages). 'NA' values indicate packages to which no identified calls to R functions could be found. Note that these results are generated by an automated code-tagging system which may not be entirely accurate.

type package ncalls
internal base 32
internal sasquatch 32
internal graphics 2
imports reticulate 3
imports knitr 2
imports htmlwidgets 1
imports rstudioapi 1
suggests rmarkdown NA
suggests testthat NA
suggests curl NA
linking_to NA NA

Click below for tallies of functions used in each package. Locations of each call within this package may be generated locally by running 's <- pkgstats::pkgstats(<path/to/repo>)', and examining the 'external_calls' table.

base

list (6), paste0 (5), paste (4), readline (3), log (2), options (2), c (1), length (1), readLines (1), sapply (1), seq_along (1), sub (1), Sys.getenv (1), Sys.which (1), system.file (1), unique (1)

sasquatch

menu (4), get_home_dir (2), list_to_config_dict (2), read_file (2), rstudio_context (2), sas_engine (2), check_connection (1), configure_saspy (1), document (1), install_saspy (1), newline (1), r_to_sas (1), rstudio_selection (1), rstudio_text_tidy (1), sas_connect (1), sas_disconnect (1), sas_download (1), sas_get_session (1), sas_list (1), sas_remove (1), sas_run_file (1), sas_run_selected (1), wrap_in_iframe (1), wrap_in_pre (1)

reticulate

import (1), py_discover_config (1), virtualenv_remove (1)

graphics

text (1), title (1)

knitr

knit_engines$set (1), knit_hooks$set (1)

htmlwidgets

sizingPolicy (1)

rstudioapi

primary_selection (1)


2. Statistical Properties

This package features some noteworthy statistical properties which may need to be clarified by a handling editor prior to progressing.

Details of statistical properties (click to open)

The package has:

  • code in JavaScript (4% in 1 files), R (96% in 10 files) and XML (0% in 1 files)
  • 1 authors
  • 1 vignette
  • no internal data file
  • 4 imported packages
  • 15 exported functions (median 8 lines of code)
  • 47 non-exported functions in R (median 8 lines of code)

Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
The following terminology is used:

  • loc = "Lines of Code"
  • fn = "function"
  • exp/not_exp = exported / not exported

All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the checks_to_markdown() function

The final measure (fn_call_network_size) is the total number of calls between functions (in R), or more abstract relationships between code objects in other languages. Values are flagged as "noteworthy" when they lie in the upper or lower 5th percentile.

measure value percentile noteworthy
files_R 10 56.4
files_inst 3 98.9
files_vignettes 0 0.0 TRUE
files_tests 6 79.4
loc_R 371 37.0
loc_inst 47 36.4
loc_tests 133 43.1
num_vignettes 1 58.8
n_fns_r 62 61.9
n_fns_r_exported 15 58.4
n_fns_r_not_exported 47 64.1
n_fns_per_file_r 3 54.3
num_params_per_fn 2 7.0
loc_per_fn_r 8 20.5
loc_per_fn_r_exp 8 16.9
loc_per_fn_r_not_exp 8 22.9
rel_whitespace_R 20 42.3
rel_whitespace_inst 70 53.2
rel_whitespace_tests 45 58.6
doclines_per_fn_exp 19 12.9
doclines_per_fn_not_exp 0 0.0 TRUE
fn_call_network_size 33 56.1

2a. Network visualisation

Click to see the interactive network visualisation of calls between objects in package


3. goodpractice and other checks

Details of goodpractice checks (click to open)

3a. Continuous Integration Badges

R-CMD-check.yaml

GitHub Workflow Results

id name conclusion sha run_number date
11990402536 pages build and deployment success 5afcec 43 2024-11-23
11990389814 pkgdown.yaml success b506da 45 2024-11-23
11990389816 R-CMD-check.yaml failure b506da 28 2024-11-23
11990150794 test-coverage.yaml failure d5bab8 26 2024-11-23

3b. goodpractice results

R CMD check with rcmdcheck

R CMD check generated the following error:

  1. checking tests ...
    Running ‘testthat.R’
    ERROR
    Running the tests in ‘tests/testthat.R’ failed.
    Last 13 lines of output:
    Backtrace:
    1. ├─sasquatch::sas_connect() at test-run.R:22:3
    2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
    3. │ │ ├─base::tryCatch(...)
    4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
    5. │ │ └─base::force(expr)
    6. │ ├─.pkgenv$SASPy$SASsession
    7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
    8. │ └─reticulate::py_get_attr(x, name, TRUE)
    9. └─reticulate (local) <fn>(<python.builtin.module>)

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 13 ]
Error: Test failures
Execution halted

R CMD check generated the following test_fail:

  1. This file is part of the standard setup for testthat.

It is recommended that you do not modify it.

Where should you do additional test configuration?

Learn more about the roles of various files in:

* https://r-pkgs.org/testing-design.html#sec-tests-files-overview

* https://testthat.r-lib.org/articles/special-files.html

library(testthat)
library(sasquatch)

test_check("sasquatch")
List of 22
$ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
$ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
$ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
$ prefix : chr "/root/.virtualenvs/r-reticulate"
$ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
$ base_exec_prefix : chr "/usr"
$ virtualenv : chr "/root/.virtualenvs/r-reticulate"
$ virtualenv_activate : chr ""
$ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
$ version :Classes 'package_version', 'numeric_version' hidden list of 1
..$ : int [1:2] 3 8
$ architecture : chr "64bit"
$ anaconda : logi FALSE
$ conda : chr "False"
$ numpy :List of 2
..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
..$ version:Class 'numeric_version' hidden list of 1
.. ..$ : int [1:3] 1 24 4
$ required_module : chr "saspy"
$ required_module_path: NULL
$ available : logi TRUE
$ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ forced : NULL

  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    [ FAIL 12 | WARN 0 | SKIP 0 | PASS 13 ]

══ Failed tests ════════════════════════════════════════════════════════════════
── Failure ('test-connection.R:4:3'): test connection ──────────────────────────
Expected sas_connect() to run without any errors.
i Actually got a with text:
Python module saspy was not found.

Detected Python configuration:

── Failure ('test-connection.R:6:3'): test connection ──────────────────────────
Expected sas_connect("oda") to run without any errors.
i Actually got a with text:
Python module saspy was not found.

Detected Python configuration:

── Failure ('test-connection.R:8:3'): test connection ──────────────────────────
Expected sas_get_session() to run without any errors.
i Actually got a with text:
No current SAS session. Use sas_connect() to start one.
── Failure ('test-connection.R:10:3'): test connection ─────────────────────────
Expected sas_disconnect() to run without any errors.
i Actually got a with text:
No current SAS session. Use sas_connect() to start one.
── Error ('test-conversion.R:4:3'): SAS to R data.frame ────────────────────────
Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-conversion.R:4:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-conversion.R:28:3'): R to SAS data.frame ───────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-conversion.R:28:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:14:3'): uploading files to SAS ────────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:14:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:38:3'): download files from SAS ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:38:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:67:3'): removing files from SAS ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:67:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:93:3'): listing files ─────────────────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:93:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-run.R:6:3'): Run SAS code from string ──────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-run.R:6:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-run.R:22:3'): Run SAS code from file ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-run.R:22:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 13 ]
Error: Test failures
Execution halted

R CMD check generated the following check_fail:

  1. rcmdcheck_tests_pass

Test coverage with covr

ERROR: Test Coverage Failed

Cyclocomplexity with cyclocomp

The following function have cyclocomplexity >= 15:

function cyclocomplexity
configure_saspy 16

Static code analyses with lintr

lintr found no issues with this package!


Package Versions

package version
pkgstats 0.2.0.48
pkgcheck 0.1.2.77


Editor-in-Chief Instructions:

Processing may not proceed until the items marked with ✖️ have been resolved.

@emilyriederer
Copy link

emilyriederer commented Dec 4, 2024

Incidentally, @ryanzomorrodi -- I see you mention not having a good idea for testing your knitr language engine. Way back in 2019, I PRed the SASS engine to knitr and wrote some test to include with my PR. I don't pretend that this is the best or only way, but I found by using mockr I could override the knitr:::is_html_output function to trick it into producing output I could compare in tests. I've attached in case its at all useful to you.

Other ideas (that I haven't tried) might include snapshot testing.

Again, maybe not the best way, maybe not necessary (the handling editor and reviewer can decide that) but just a few passing thoughts. I also recognize that knitr engines I think are a bit more binary in how and whether they work so may not benefit from testing as much as parts of the code with many corner cases.

test_eng_sxss.txt

@ryanzomorrodi
Copy link
Author

That seems like a very reasonable approach, I will try it out. Thank you

@maurolepore
Copy link
Member

@ropensci-review-bot assign @maurolepore as editor

@ropensci-review-bot
Copy link
Collaborator

Assigned! @maurolepore is now the editor

@maurolepore
Copy link
Member

maurolepore commented Dec 14, 2024

Dear @ryanzomorrodi, thanks so much for your submission. I'm happy to be the handling editor.

Within the next few days I'll be reading this thread in more detail, and going through editor checks.

  • ml01. In the meantime, could you please suggest three reviewers?

It might help you to see the criteria we use to choose reviewers, particularly how we define a conflict of interest.

It's also a good time to do any changes you might have in mind. Once the reviews start it's best to avoid forcing reviewers to work against a moving target.

Very excited your tool as a way to bridge SAS and R 💯 🥇

@ryanzomorrodi
Copy link
Author

Hi @maurolepore

That's great to hear! I reviewed the criteria, but I'm wondering if there is a set list of reviewers to choose from or should I post something on social media. It looks like the book mentions an Airtable directory, but it feels like that is just for editors.

My primary interest is to select reviewers with some level of SAS experience.

@maurolepore
Copy link
Member

@ryanzomorrodi, that's right, that airtable database is restricted to editors.

If nobody from your own network comes to mind, then no need to stretch to social media.

We ask for suggestions only to ensure we understand the kind of skills the author believes to be useful, so thanks for highlighting the usefulness of SAS experience 🙏👍

@ryanzomorrodi
Copy link
Author

Sounds good! I apologize, I'm a relative newcomer to the R open-source world, so I'm not super familiar with the space

@maurolepore
Copy link
Member

No problem at all. One great reason to be here is precisely to expand your networks :-)

@maurolepore
Copy link
Member

@ropensci-review-bot check package

@ropensci-review-bot
Copy link
Collaborator

Thanks, about to send the query.

@ropensci-review-bot
Copy link
Collaborator

🚀

Editor check started

👋

@ropensci-review-bot
Copy link
Collaborator

Checks for sasquatch (v0.0.0.9017)

git hash: aee061da

  • ✔️ Package name is available
  • ✔️ has a 'codemeta.json' file.
  • ✔️ has a 'contributing' file.
  • ✔️ uses 'roxygen2'.
  • ✔️ 'DESCRIPTION' has a URL field.
  • ✔️ 'DESCRIPTION' has a BugReports field.
  • ✔️ Package has at least one HTML vignette
  • ✔️ All functions have examples.
  • ✔️ Package has continuous integration checks.
  • ✖️ Package coverage failed
  • ✖️ R CMD check found 1 error.
  • ✖️ R CMD check found 1 warning.

Important: All failing checks above must be addressed prior to proceeding

Package License: MIT + file LICENSE


1. Package Dependencies

Details of Package Dependency Usage (click to open)

The table below tallies all function calls to all packages ('ncalls'), both internal (r-base + recommended, along with the package itself), and external (imported and suggested packages). 'NA' values indicate packages to which no identified calls to R functions could be found. Note that these results are generated by an automated code-tagging system which may not be entirely accurate.

type package ncalls
internal sasquatch 37
internal base 33
internal graphics 2
imports reticulate 3
imports knitr 2
imports chk 1
imports htmlwidgets 1
imports rstudioapi 1
suggests rmarkdown NA
suggests testthat NA
suggests curl NA
linking_to NA NA

Click below for tallies of functions used in each package. Locations of each call within this package may be generated locally by running 's <- pkgstats::pkgstats(<path/to/repo>)', and examining the 'external_calls' table.

sasquatch

menu (4), get_home_dir (2), list_to_config_dict (2), read_file (2), rstudio_context (2), sas_engine (2), wrap_in_iframe (2), chk_connection (1), chk_has_rownames (1), configure_saspy (1), document (1), execute_safely (1), install_saspy (1), newline (1), r_to_sas (1), rstudio_selection (1), rstudio_text_tidy (1), sas_connect (1), sas_disconnect (1), sas_download (1), sas_get_session (1), sas_list (1), sas_remove (1), sas_run_file (1), sas_run_selected (1), sas_run_string (1), sas_to_r (1), wrap_in_pre (1)

base

list (5), paste0 (5), paste (4), readline (3), log (2), options (2), c (1), call (1), length (1), parent.frame (1), readLines (1), sapply (1), seq_along (1), sub (1), Sys.getenv (1), Sys.which (1), system.file (1), unique (1)

reticulate

import (1), py_discover_config (1), virtualenv_remove (1)

graphics

text (1), title (1)

knitr

knit_engines$set (1), knit_hooks$set (1)

chk

abort_chk (1)

htmlwidgets

sizingPolicy (1)

rstudioapi

primary_selection (1)


2. Statistical Properties

This package features some noteworthy statistical properties which may need to be clarified by a handling editor prior to progressing.

Details of statistical properties (click to open)

The package has:

  • code in JavaScript (4% in 1 files), R (96% in 11 files) and XML (0% in 1 files)
  • 1 authors
  • 1 vignette
  • no internal data file
  • 5 imported packages
  • 15 exported functions (median 10 lines of code)
  • 55 non-exported functions in R (median 8 lines of code)

Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
The following terminology is used:

  • loc = "Lines of Code"
  • fn = "function"
  • exp/not_exp = exported / not exported

All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the checks_to_markdown() function

The final measure (fn_call_network_size) is the total number of calls between functions (in R), or more abstract relationships between code objects in other languages. Values are flagged as "noteworthy" when they lie in the upper or lower 5th percentile.

measure value percentile noteworthy
files_R 11 60.2
files_inst 3 98.8
files_vignettes 0 0.0 TRUE
files_tests 6 79.4
loc_R 449 42.4
loc_inst 47 34.9
loc_tests 133 43.0
num_vignettes 1 58.8
n_fns_r 70 65.3
n_fns_r_exported 15 58.4
n_fns_r_not_exported 55 68.5
n_fns_per_file_r 3 55.2
num_params_per_fn 2 7.1
loc_per_fn_r 8 24.5
loc_per_fn_r_exp 10 22.9
loc_per_fn_r_not_exp 8 23.0
rel_whitespace_R 18 44.4
rel_whitespace_inst 70 52.2
rel_whitespace_tests 45 58.5
doclines_per_fn_exp 19 12.9
doclines_per_fn_not_exp 0 0.0 TRUE
fn_call_network_size 44 62.5

2a. Network visualisation

Click to see the interactive network visualisation of calls between objects in package


3. goodpractice and other checks

Details of goodpractice checks (click to open)

3a. Continuous Integration Badges

R-CMD-check.yaml

GitHub Workflow Results

id name conclusion sha run_number date
12408303336 pages build and deployment success dd809c 45 2024-12-19
12408283861 pkgdown.yaml success aee061 47 2024-12-19
12408283864 R-CMD-check.yaml failure aee061 30 2024-12-19
11990150794 test-coverage.yaml failure d5bab8 26 2024-11-23

3b. goodpractice results

R CMD check with rcmdcheck

R CMD check generated the following error:

  1. checking tests ...
    Running ‘testthat.R’
    ERROR
    Running the tests in ‘tests/testthat.R’ failed.
    Last 13 lines of output:
    Backtrace:
    1. ├─sasquatch::sas_connect() at test-run.R:22:3
    2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
    3. │ │ ├─base::tryCatch(...)
    4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
    5. │ │ └─base::force(expr)
    6. │ ├─.pkgenv$SASPy$SASsession
    7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
    8. │ └─reticulate::py_get_attr(x, name, TRUE)
    9. └─reticulate (local) <fn>(<python.builtin.module>)

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 9 ]
Error: Test failures
Execution halted

R CMD check generated the following warning:

  1. checking for code/documentation mismatches ... WARNING
    Codoc mismatches from Rd file 'install_saspy.Rd':
    install_saspy
    Code: function(envname = "r-saspy", extra_packages, restart_session =
    TRUE)
    Docs: function(envname = "r-saspy", extra_packages = NULL,
    restart_session = TRUE)
    Mismatches in argument default values:
    Name: 'extra_packages' Code: Docs: NULL

R CMD check generated the following test_fail:

  1. This file is part of the standard setup for testthat.

It is recommended that you do not modify it.

Where should you do additional test configuration?

Learn more about the roles of various files in:

* https://r-pkgs.org/testing-design.html#sec-tests-files-overview

* https://testthat.r-lib.org/articles/special-files.html

library(testthat)
library(sasquatch)

test_check("sasquatch")
List of 22
$ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
$ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
$ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
$ prefix : chr "/root/.virtualenvs/r-reticulate"
$ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
$ base_exec_prefix : chr "/usr"
$ virtualenv : chr "/root/.virtualenvs/r-reticulate"
$ virtualenv_activate : chr ""
$ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
$ version :Classes 'package_version', 'numeric_version' hidden list of 1
..$ : int [1:2] 3 8
$ architecture : chr "64bit"
$ anaconda : logi FALSE
$ conda : chr "False"
$ numpy :List of 2
..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
..$ version:Class 'numeric_version' hidden list of 1
.. ..$ : int [1:3] 1 24 4
$ required_module : chr "saspy"
$ required_module_path: NULL
$ available : logi TRUE
$ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
$ forced : NULL

  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    List of 22
    $ python : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ libpython : chr "/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so"
    $ pythonhome : chr "/root/.virtualenvs/r-reticulate:/root/.virtualenvs/r-reticulate"
    $ pythonpath : chr "/usr/lib/python38.zip:/usr/lib/python3.8:/usr/lib/python3.8/lib-dynload:/root/.virtualenvs/r-reticulate/lib/pyt"| truncated
    $ prefix : chr "/root/.virtualenvs/r-reticulate"
    $ exec_prefix : chr "/root/.virtualenvs/r-reticulate"
    $ base_exec_prefix : chr "/usr"
    $ virtualenv : chr "/root/.virtualenvs/r-reticulate"
    $ virtualenv_activate : chr ""
    $ executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ base_executable : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ version_string : chr "3.8.10 (default, Nov 7 2024, 13:10:47) [GCC 9.4.0]"
    $ version :Classes 'package_version', 'numeric_version' hidden list of 1
    ..$ : int [1:2] 3 8
    $ architecture : chr "64bit"
    $ anaconda : logi FALSE
    $ conda : chr "False"
    $ numpy :List of 2
    ..$ path : chr "/root/.virtualenvs/r-reticulate/lib/python3.8/site-packages/numpy"
    ..$ version:Class 'numeric_version' hidden list of 1
    .. ..$ : int [1:3] 1 24 4
    $ required_module : chr "saspy"
    $ required_module_path: NULL
    $ available : logi TRUE
    $ python_versions : chr "/root/.virtualenvs/r-reticulate/bin/python"
    $ forced : NULL
  • attr(*, "class")= chr "py_config"
    [ FAIL 12 | WARN 0 | SKIP 0 | PASS 9 ]

══ Failed tests ════════════════════════════════════════════════════════════════
── Failure ('test-connection.R:4:3'): test connection ──────────────────────────
Expected sas_connect() to run without any errors.
i Actually got a with text:
Python module saspy was not found.

Detected Python configuration:

── Failure ('test-connection.R:6:3'): test connection ──────────────────────────
Expected sas_connect("oda") to run without any errors.
i Actually got a with text:
Python module saspy was not found.

Detected Python configuration:

── Failure ('test-connection.R:10:3'): test connection ─────────────────────────
Expected sas_disconnect() to run without any errors.
i Actually got a <chk_error> with text:
No active SAS session. Use sas_connect() to start one.
── Failure ('test-connection.R:14:3'): test connection ─────────────────────────
sas_get_session() did not throw the expected error.
── Error ('test-conversion.R:4:3'): SAS to R data.frame ────────────────────────
Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-conversion.R:4:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-conversion.R:28:3'): R to SAS data.frame ───────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-conversion.R:28:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:14:3'): uploading files to SAS ────────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:14:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:38:3'): download files from SAS ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:38:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:67:3'): removing files from SAS ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:67:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-io.R:93:3'): listing files ─────────────────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-io.R:93:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-run.R:6:3'): Run SAS code from string ──────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-run.R:6:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)
    ── Error ('test-run.R:22:3'): Run SAS code from file ───────────────────────────
    Error: Python module saspy was not found.

Detected Python configuration:

Backtrace:

  1. ├─sasquatch::sas_connect() at test-run.R:22:3
  2. │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
  3. │ │ ├─base::tryCatch(...)
  4. │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
  5. │ │ └─base::force(expr)
  6. │ ├─.pkgenv$SASPy$SASsession
  7. │ └─reticulate:::$.python.builtin.module(.pkgenv$SASPy, "SASsession")
  8. │ └─reticulate::py_get_attr(x, name, TRUE)
  9. └─reticulate (local) <fn>(<python.builtin.module>)

[ FAIL 12 | WARN 0 | SKIP 0 | PASS 9 ]
Error: Test failures
Execution halted

R CMD check generated the following check_fails:

  1. rcmdcheck_code_docs_mismatch
  2. rcmdcheck_tests_pass

Test coverage with covr

ERROR: Test Coverage Failed

Cyclocomplexity with cyclocomp

The following function have cyclocomplexity >= 15:

function cyclocomplexity
configure_saspy 16

Static code analyses with lintr

lintr found no issues with this package!


Package Versions

package version
pkgstats 0.2.0.48
pkgcheck 0.1.2.77


Editor-in-Chief Instructions:

Processing may not proceed until the items marked with ✖️ have been resolved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants