-
-
Notifications
You must be signed in to change notification settings - Fork 104
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
Comments
Thanks for submitting to rOpenSci, our editors and @ropensci-review-bot will reply soon. Type |
🚀 Editor check started 👋 |
Checks for sasquatch (v0.0.0.9004)git hash: 8353d8ac
Important: All failing checks above must be addressed prior to proceeding Package License: MIT + file LICENSE 1. Package DependenciesDetails 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.
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. sasquatchread_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) baselist (2), log (2), system.file (2), length (1), options (1), paste (1), paste0 (1) graphicstext (1) htmlwidgetssizingPolicy (1) knitrknit_engines$set (1) reticulateimport (1) rstudioapiprimary_selection (1) 2. Statistical PropertiesThis 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:
Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the The final measure (
2a. Network visualisationClick to see the interactive network visualisation of calls between objects in package 3.
|
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:
- 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 withreticulate::virtualenv_create('r-reticulate')
.
Backtrace:
▆- └─sasquatch::sas_connect() at test-run.R:18:3
- └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
-
└─reticulate:::ensure_python_initialized()
-
└─reticulate:::initialize_python()
-
└─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:
-
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:
▆
- └─sasquatch::sas_connect() at test-conversion.R:2:3
- └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
-
└─reticulate:::ensure_python_initialized()
-
└─reticulate:::initialize_python()
-
└─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:
▆
- └─sasquatch::sas_connect() at test-conversion.R:24:3
- └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
-
└─reticulate:::ensure_python_initialized()
-
└─reticulate:::initialize_python()
-
└─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:
▆
- └─sasquatch::sas_connect() at test-io.R:12:3
- └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
-
└─reticulate:::ensure_python_initialized()
-
└─reticulate:::initialize_python()
-
└─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:
▆
- └─sasquatch::sas_connect() at test-io.R:34:3
- └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
-
└─reticulate:::ensure_python_initialized()
-
└─reticulate:::initialize_python()
-
└─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:
▆
- └─sasquatch::sas_connect() at test-io.R:61:3
- └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
-
└─reticulate:::ensure_python_initialized()
-
└─reticulate:::initialize_python()
-
└─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:
▆
- └─sasquatch::sas_connect() at test-io.R:85:3
- └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
-
└─reticulate:::ensure_python_initialized()
-
└─reticulate:::initialize_python()
-
└─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:
▆
- └─sasquatch::sas_connect() at test-run.R:4:3
- └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
-
└─reticulate:::ensure_python_initialized()
-
└─reticulate:::initialize_python()
-
└─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:
▆
- └─sasquatch::sas_connect() at test-run.R:18:3
- └─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
-
└─reticulate:::ensure_python_initialized()
-
└─reticulate:::initialize_python()
-
└─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:
- 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.
Hi @ryanzomorrodi ! Thanks for your submission. I see your (Transparently, I'm not a SAS user, so I lack some background context on this space.) |
Hi @emilyriederer , I have never used the native One package I forgot to mention is 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, |
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. |
Sounds great! Thank you |
Hi @ryanzomorrodi - I'm happy to share that we think (Also, what an absolutely perfect name...) |
@ropensci-review-bot check package |
Thanks, about to send the query. |
🚀 Editor check started 👋 |
Checks for sasquatch (v0.0.0.9014)git hash: b506da05
Important: All failing checks above must be addressed prior to proceeding Package License: MIT + file LICENSE 1. Package DependenciesDetails 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.
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. baselist (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) sasquatchmenu (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) reticulateimport (1), py_discover_config (1), virtualenv_remove (1) graphicstext (1), title (1) knitrknit_engines$set (1), knit_hooks$set (1) htmlwidgetssizingPolicy (1) rstudioapiprimary_selection (1) 2. Statistical PropertiesThis 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:
Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the The final measure (
2a. Network visualisationClick to see the interactive network visualisation of calls between objects in package 3.
|
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:
- checking tests ...
Running ‘testthat.R’
ERROR
Running the tests in ‘tests/testthat.R’ failed.
Last 13 lines of output:
Backtrace:
▆- ├─sasquatch::sas_connect() at test-run.R:22:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
-
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:
▆
- ├─sasquatch::sas_connect() at test-conversion.R:4:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-conversion.R:28:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-io.R:14:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-io.R:38:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-io.R:67:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-io.R:93:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-run.R:6:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-run.R:22:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
- 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.
Incidentally, @ryanzomorrodi -- I see you mention not having a good idea for testing your 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. |
That seems like a very reasonable approach, I will try it out. Thank you |
@ropensci-review-bot assign @maurolepore as editor |
Assigned! @maurolepore is now the editor |
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.
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 💯 🥇 |
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. |
@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 🙏👍 |
Sounds good! I apologize, I'm a relative newcomer to the R open-source world, so I'm not super familiar with the space |
No problem at all. One great reason to be here is precisely to expand your networks :-) |
@ropensci-review-bot check package |
Thanks, about to send the query. |
🚀 Editor check started 👋 |
Checks for sasquatch (v0.0.0.9017)git hash: aee061da
Important: All failing checks above must be addressed prior to proceeding Package License: MIT + file LICENSE 1. Package DependenciesDetails 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.
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. sasquatchmenu (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) baselist (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) reticulateimport (1), py_discover_config (1), virtualenv_remove (1) graphicstext (1), title (1) knitrknit_engines$set (1), knit_hooks$set (1) chkabort_chk (1) htmlwidgetssizingPolicy (1) rstudioapiprimary_selection (1) 2. Statistical PropertiesThis 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:
Statistical properties of package structure as distributional percentiles in relation to all current CRAN packages
All parameters are explained as tooltips in the locally-rendered HTML version of this report generated by the The final measure (
2a. Network visualisationClick to see the interactive network visualisation of calls between objects in package 3.
|
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:
- checking tests ...
Running ‘testthat.R’
ERROR
Running the tests in ‘tests/testthat.R’ failed.
Last 13 lines of output:
Backtrace:
▆- ├─sasquatch::sas_connect() at test-run.R:22:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
- 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:
-
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:
▆
- ├─sasquatch::sas_connect() at test-conversion.R:4:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-conversion.R:28:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-io.R:14:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-io.R:38:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-io.R:67:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-io.R:93:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-run.R:6:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
▆
- ├─sasquatch::sas_connect() at test-run.R:22:3
- │ ├─reticulate::py_capture_output(.pkgenv$session <- .pkgenv$SASPy$SASsession())
- │ │ ├─base::tryCatch(...)
- │ │ │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
- │ │ └─base::force(expr)
- │ ├─.pkgenv$SASPy$SASsession
- │ └─reticulate:::
$.python.builtin.module
(.pkgenv$SASPy, "SASsession") - │ └─reticulate::py_get_attr(x, name, TRUE)
- └─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:
- rcmdcheck_code_docs_mismatch
- 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.
@ryanzomorrodi thanks again for this submission. I had the change to dive deep into sasquatch and made comments that intend to help it go through review as smoothly as possible. For that it's crucial that reviewers can explore the package as quickly as possible so that they can invest time in the more interesting aspects of sasquatch (rather than, say, debugging installation issues). Also it will help to make an effort to predict what reviewers will expect, based on what's common in the relevant community of practice. Here I can only contribute what relates to general R-package development, and you'll need to work on the more "SAS" related content. I acknoledge that the comments are many and can feel intimidating. Please know we're all here to help and we're not in a rush. Take your time to process the comments, ask as many questions as you need, make your own research and judgements. With the holidays ahead I expect the process to experience some delays. No problem if you already know you won't be able to work for a few months. In that case just let me know and we can tag the issue "on hold" so that in the meantime I can take other packages. Editor checks:
Editor commentsTo help you track my comments I'll tag them with "ml" and a numbered sequence, I already used ml01 above so the next tag will be ml02. DocumentationIs the case for the package well made?
This narrower focus in not a problem for rOpenSc; Specific applications in Is the reference index page clear (grouped by topic if necessary)?Thanks! The index is clearly organized by topic, and with a little more effort
Are vignettes readable, sufficiently detailed and not just perfunctory?
Fit: The package meets criteria for fit and overlap.
To do this well you'll need to research the perspective of someone with resources Here are some ideas:
Installation instructions: Are installation instructions clear enough for human users?
packageVersion("sasquatch"); sasquatch::install_saspy()
#> [1] '0.0.0.9017'
#> Error in sasquatch::install_saspy(): argument "extra_packages" is missing, with no default Created on 2024-12-23 with reprex v2.1.1
Tests: If the package has some interactivity / HTTP / plot production etc. are the tests using state-of-the-art tooling?I see good effort put into tests, and with some guidance I hope they will be an
Example of the test output I see
Contributing information: Is the documentation for contribution clear enough e.g. tokens for tests, playgrounds?
Additional considerations
urlchecker::url_check()
#> fetching [ 0 / 15 ]fetching [ 1 / 15 ]fetching [ 2 / 15 ]fetching [ 3 / 15 ]fetching [ 4 / 15 ]fetching [ 5 / 15 ]fetching [ 6 / 15 ]fetching [ 7 / 15 ]fetching [ 8 / 15 ]fetching [ 9 / 15 ]fetching [ 10 / 15 ]fetching [ 11 / 15 ]fetching [ 12 / 15 ]fetching [ 13 / 15 ]fetching [ 14 / 15 ]
#> ! Warning: DESCRIPTION:26:50 Moved
#> URL: https://ryanzomorrodi.github.io/sasquatch/, https://github.com/ryanzomorrodi/sasr
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> https://github.com/ryanzomorrodi/sasquatch
#> ! Warning: DESCRIPTION:33:13 Moved
#> BugReports: https://github.com/ryanzomorrodi/sasr/issues
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> https://github.com/ryanzomorrodi/sasquatch
#> ! Warning: README.md:8:17 Moved
#> [![R-CMD-check](https://github.com/ryanzomorrodi/sasr/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ryanzomorrodi/sasr/actions/workflows/R-CMD-check.yaml)
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> https://github.com/ryanzomorrodi/sasquatch/actions/workflows/R-CMD-check.yaml
#> ! Warning: DESCRIPTION:33:13 Moved
#> BugReports: https://github.com/ryanzomorrodi/sasr/issues
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> https://github.com/ryanzomorrodi/sasquatch/issues
#> Warning in readLines(file_path): incomplete final line found on
#> '/home/rstudio/git/sasquatch/vignettes/setting_up.rmd'
#> ✖ Error: vignettes/setting_up.rmd:17:46 404: Not Found
#> `sasquatch` works by utilizing the [`SASPy`](https://sassoftware.github.io/SASPy/) python package, similar to packages like [`sasr`](https://github.com/insightsengineering/sasr) or [configSAS](https://github.com/baselr/configSAS). This means everything we do to connect R and SAS, needs to go through `SASPy`.
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> ✖ Error: vignettes/setting_up.rmd:21:120 404: Not Found
#> For more information about setting up non-ODA `SASPy` connections, check out the [`SASPy` configuration documentation](https://sassoftware.github.io/SASPy/configuration.html#).
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> Warning in readLines(file_path): incomplete final line found on
#> '/home/rstudio/git/sasquatch/vignettes/setting_up.rmd'
#> ✖ Error: vignettes/setting_up.rmd:21:120 404: Not Found
#> For more information about setting up non-ODA `SASPy` connections, check out the [`SASPy` configuration documentation](https://sassoftware.github.io/SASPy/configuration.html#).
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> Warning in readLines(file_path): incomplete final line found on
#> '/home/rstudio/git/sasquatch/vignettes/setting_up.rmd'
#> ✖ Error: vignettes/setting_up.rmd:52:88 403: Forbidden
#> Make sure Java is installed on your system. You can download Java from [their website](https://www.java.com/en/download/). Note the Java installation path.
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> Warning in readLines(file_path): incomplete final line found on
#> '/home/rstudio/git/sasquatch/vignettes/setting_up.rmd'
#> ✖ Error: vignettes/setting_up.rmd:40:98 404: Not Found
#> Make sure Python is installed on your system. You can download from [Python Software Foundation](https://www.python.org/downloads'), or use `install_python()` from reticulate:
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> ! Warning: README.md:29:12 Moved
#> Academics](https://www.sas.com/en_us/software/on-demand-for-academics)
#> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#> https://www.sas.com/content/sascom/en_us/software/on-demand-for-academics/
|
Hi @maurolepore Sorry for the delay in response. I have tried to address as many of the issues that I can. I will probably need some time to reach out to others to see if there is anyone within the pharmaverse or rOpenSci interested in telling me about their use cases. ml02 I try to kind of get at the purpose with the following the text:
I could expand on it further, but I think the use case for thispackage is summarized within the first line. I see this as useful for someone looking to create multilingual reports where they can connect to nearly any SAS client, pass data back and forth, and have a single reproducable document contain all the code and output. ml03 I added types to every function parameter, specified analagous functions for ml04 I created a Getting started vignette and included a brief breakdown of each function. ml05 I did add additional info to similar packages section of the README. I really don't see a reason to use That being said I think getting outside perspectives is probably a good thing. Hopefully, I can find interested individuals or even get the views of my professors who use SAS. ml06 This I have yet to do, but plan on doing. ml07 This error was a very simple mistake in the function code. I have since implemented a lot more testing for many of the functions, so hopefully I caught most of the mistakes like this. I'm not sure if you have any recommendations as to how I can better test the I also use linux so maybe watching others on other platforms would help me get a better idea of potential pitfalls. ml08 I may add this later. I chose pak for the purpose that it explictly lists out all system dependencies needed, which is definitely and added benefit. ml09 Recording an installation video is definitely something I could do. I first want to see what different platform's installation is like, so I might delay this. ml10 Done, initially I liked having relevant functions within the same file because they were close together, but even when separating them out they still organized themselves. ml12 Right now all the tests run in about 2 minutes. I am missing tests for ml13 There were two uses of ml14 I added instructions that specifies that testing can be done with SAS ODA and that I removed the setup file entirely. ml15 I used ml16 A SAS <-> R was added to the Getting Started vignette. There is no way to make the round trip perfect because of limitations with SAS data types, but I explained any differences. ml17 Changed ml18 I use Positron, but I have made most of the docs with RStudio in mind because at least for now that is the more dominant among R users, but I tried to include references to Positron, where functionality diverged. Thank you for all your thorough comments. This is all helpful insight! |
@ryanzomorrodi thanks so much for your work! Based on your comment I ticked lots of boxes. In the next few days I'll try installation, setup, and testing and I'll think about your question:
I'll come back early next year 😄 Happy hollidays! BTW, re-reading my own comment above I found so many sloppy typos -- I apologize. |
@ryanzomorrodi, thanks again for the work you put into enhancing the code and sharing it with rOpenSci. I looked at your answers and as I looked at the code I made a number of notes that you might find helpful. At this point most of them should be thought as optional suggestions. Again, remember the intent is to ensure the reviewers can do their job as quickly as possible, so please try your best to maximize the chance they'll be able to install, configure and test the code without errors, and as quickly as possible. I share some ideas to make tests run faster. It suggest you take a lil time to digest this feedback and let me know when you feel you're ready to engage reviewers. Then I'll start an active search. README
The top section reads:
Consider reserving this section for the package goal alone, and moving configuration details after installation. These seems to be a natural sequence:
Before usage we need configuration. Sending readears to a vignette is fine but making README self-contained seems better because it minimizes the information-hunt before a succesfull first run. Consider moving here the section "SAS On Demand for Academics", explaining this is a good way to get started for those who lack a license (which seems to be an important audience of this package), then pointing to the vignette for more advanced configuration. I would focus on helping a) the reviewers, b) then curious R users, c) then anyone else. The users a-b likely lack a SAS license and are rushed to get something running.
I see: "Now, you should be able to run SAS code blocks in RStudio like any other." Also, sasquatch seems to also work with Rmarkdown, right? Does it deserve a mention? Enhancements
devtools::load_all()
#> ℹ Loading sasquatch
sas_connect()
#> SAS Connection established.
system.time(sas_list("bad"))
#> user system elapsed
#> 0.003 0.001 2.006
# Same time
system.time(sas_list("bad"))
#> user system elapsed
#> 0.004 0.000 2.708
# Maybe this specific funciton isn't the best candidate for memoise() but
# hopefully illustrates the idea
sas_list2 <- memoise::memoise(sas_list)
system.time(sas_list2("bad"))
#> user system elapsed
#> 0.005 0.001 3.011
# No time
system.time(sas_list2("bad"))
#> user system elapsed
#> 0.013 0.000 0.012
system.time(sas_list2("bad"))
#> user system elapsed
#> 0.000 0.000 0.001
system.time(sas_list2("bad"))
#> user system elapsed
#> 0 0 0
# https://memoise.r-lib.org/
# https://r-pkgs.org/testing-advanced.html Created on 2025-01-12 with reprex v2.1.1
devtools::load_all()
#> ℹ Loading sasquatch
# Refactor: Rename the implementation
sas_connect_impl <- sas_connect
# Enhance the user-facing function
sas_connect <- function(cfgname, reconnect = FALSE) {
unconnected <- is.null(sas_get_session())
if (unconnected || reconnect) {
sas_connect_impl(cfgname)
} else {
message("Already connected.")
invisible()
}
}
# The current implementation reconnects, which is slow and likely unnecesary
system.time({
sas_connect_impl()
sas_connect_impl()
})
#> SAS Connection established.
#> SAS Connection established.
#> user system elapsed
#> 0.140 0.068 34.758
sas_disconnect()
#> SAS Connection terminated.
# The new user-facing function doesn't re-connect
system.time({
sas_connect()
sas_connect()
})
#> SAS Connection established.
#> Already connected.
#> user system elapsed
#> 0.028 0.013 15.667
sas_disconnect()
#> SAS Connection terminated.
# The user can still request to reconnect on demand
system.time({
sas_connect()
sas_connect(reconnect = TRUE)
})
#> SAS Connection established.
#> SAS Connection established.
#> user system elapsed
#> 0.043 0.035 35.936 Created on 2025-01-12 with reprex v2.1.1 Reference
Tests
For example, devtools::load_all()
#> ℹ Loading sasquatch
library(testthat)
# This is what head of sas_engine() looks like. The rest doesn't matter for
# this specific test.
sas_engine <- function (options) {
# Some checks that force a connection even when we don't need it
chk_connection()
options$engine <- "txt"
options$results <- "asis"
code <- paste(options$code, collapse = "\n")
# Some logic we want to test
if (!isTRUE(getOption('knitr.in.progress'))) {
r eturn(sas_run_string(code))
}
"... a lot more code"
}
test_that("if the option `knitr.in.progress` is not TRUE returns early", {
withr::local_options(knitr.in.progress = "not `TRUE`")
testthat::local_mocked_bindings(
# Turn off checks, since here we don't need a real connection
chk_connection = function() NULL,
# Test that knitr.in.progress forces sas_engine() to return early
sas_run_string = function(code) "retuning early"
)
expect_equal(sas_engine(list(code = "whatever")), "retuning early")
})
#> Test passed 🎉 Created on 2025-01-13 with reprex v2.1.1 More resources:
# Passes: Tests for sas_list() pass because test-connect() first calls sas_connect()
tests/testthat/
- test-connect()
- test-list()
# Fails: Tests for sas_list() fail because they run before test-connect.R calls sas_connect()
tests/testthat/
- test-aaa-list()
- test-connect() You can avoid this dependency by calling
devtools::load_all()
#> ℹ Loading sasquatch
# tests/testthat/helper.R
skip_if_unconnected <- function() {
skip_if(
is.null(sas_get_session()),
"No active SAS session. Use sas_connect() to start one."
)
}
# tests/testthat/test-*.R
testthat::test_that("needs a sas connection", {
skip_if_unconnected()
sas_list()
})
#> ── Skip: needs a sas connection ────────────────────────────────────────────────
#> Reason: No active SAS session. Use sas_connect() to start one.
# tests/testthat/test-*.R
# This IS informative but:
# * Doesn't communicate the develper the the connection is a requirement
# * Burries the relevant information with irrelevant clutter from the backtrace
testthat::test_that("needs a sas connection", {
sas_list()
})
#> ── Error: needs a sas connection ───────────────────────────────────────────────
#> <chk_error/rlang_error/error/condition>
#> Error in `sas_list()`: No active SAS session. Use sas_connect() to start one.
#> Backtrace:
#> ▆
#> 1. └─sasquatch::sas_list()
#> 2. └─sasquatch:::chk_connection() at sasquatch/R/list.R:17:3
#> 3. └─chk::abort_chk("No active SAS session. Use sas_connect() to start one.") at sasquatch/R/connection-checks.R:15:3
#> 4. └─chk::err(..., n = n, tidy = tidy, class = "chk_error", call = call)
#> 5. └─rlang::abort(msg, class = class, !!!args[named], call = call)
#> Error:
#> ! Test failed Created on 2025-01-12 with reprex v2.1.1
devtools::load_all()
#> ℹ Loading sasquatch
# See https://testthat.r-lib.org/articles/test-fixtures.html#local-helpers
# tests/testthat/helper.R
local_sas_connect <- function(..., env = parent.frame()) {
sas_connect()
withr::defer(suppressMessages(sas_disconnect()), envir = env)
}
# The connection is self-destroying
local({
local_sas_connect()
sas_get_session()
})
#> SAS Connection established.
#> Access Method = IOM
#> SAS Config name = oda
#> SAS Config file = /home/rstudio/git/sasquatch/.venv/lib/python3.12/site-packages/saspy/sascfg_personal.py
#> WORK Path = /saswork/SAS_workF49F00002AC2_odaws01-usw2.oda.sas.com/SAS_work77E600002AC2_odaws01-usw2.oda.sas.com/
#> SAS Version = 9.04.01M7P08062020
#> SASPy Version = 5.101.1
#> Teach me SAS = False
#> Batch = False
#> Results = HTML
#> SAS Session Encoding = utf-8
#> Python Encoding value = utf-8
#> SAS process Pid value = None
#> SASsession started = Sun Jan 12 17:24:16 2025
# Gone!
sas_get_session()
#> NULL Created on 2025-01-12 with reprex v2.1.1
Example: devtools::load_all()
#> ℹ Loading sasquatch
library(testthat)
test_that("with a list column throws a 'chk_error'", {
with_list_column <- tibble::tibble(x = list(1))
expect_error(sas_from_r(with_list_column, "df"), class = "chk_error")
})
#> Test passed 🎉 Created on 2025-01-13 with reprex v2.1.1
|
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
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.):
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.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 likesasr
orconfigSAS
.sasr
, while similar tosasquatch
, does not include interactive SAS functionality or aknitr
engine. On the other hand,configSAS
includes aknitr
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 theknitr
engine because I am struggling to think about how I can test that effectively. My assumption that the automatedpkgcheck
testing will fail due to the need forpython
, python packageSASPy
,java
, and a SAS License. (I have set up a CI that has all of these set up within thesasquatch
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
Code of conduct
The text was updated successfully, but these errors were encountered: