Giter Site home page Giter Site logo

lookup's Introduction

lookup

Lookup R function definitions, including compiled code, S3 and S4 methods from packages installed locally, or from GitHub, CRAN or Bioconductor.

Travis-CI Build Status Coverage Status

luke

Installation

# install.packages("devtools")
devtools::install_github("jimhester/lookup")

See Setup for additional setup instructions.

Example

Normal Functions (with compiled code)

Imgur

S3 generics and methods

Imgur

S4 generics and methods

Imgur

In RStudio IDE

Imgur

Usage

# Lookup a function
lookup::lookup(body)
#> base::body [closure] 
#> function (fun = sys.function(sys.parent())) 
#> {
#>     if (is.character(fun)) 
#>         fun <- get(fun, mode = "function", envir = parent.frame())
#>     .Internal(body(fun))
#> }
#> <bytecode: 0x7fa65cada988>
#> <environment: namespace:base>
#> // c source: src/main/builtin.c#L255-L266
#> SEXP attribute_hidden do_body(SEXP call, SEXP op, SEXP args, SEXP rho)
#> {
#>     checkArity(op, args);
#>     if (TYPEOF(CAR(args)) == CLOSXP)
#>  return duplicate(BODY_EXPR(CAR(args)));
#>     else {
#>  if(!(TYPEOF(CAR(args)) == BUILTINSXP ||
#>       TYPEOF(CAR(args)) == SPECIALSXP))
#>      warningcall(call, _("argument is not a function"));
#>  return R_NilValue;
#>     }
#> }

# Can also open a browser at that function's location
lookup_browse()

Setup

lookup makes heavy use of the GitHub API, which has a rate limit of 60 requests per hour when unauthenticated. You can create a Personal access token with no scope, which will increase your limit to 5000 requests per hour.

The usethis package has a helper function to help you generate such a token, usethis::browse_github_token().

Once you have generated a token, add it to your ~/.Renviron file or shell startup file and it will be automatically used for further requests.

GITHUB_PAT=7d8d0436835d1baXYZ1234

gh::gh("/rate_limit") can be used to query your current usage and limits.

Default printing

lookup can be used as a complete replacement for function printing by attaching the package. To make this the default simply add this to your .Rprofile.

if (interactive()) {
  suppressPackageStartupMessages(library(lookup))
}

If you do not want make this the default simply call lookup::lookup().

How this works

If a base R function is printed that calls compiled code the code is looked up using the R git mirror. If a CRAN package has compiled code it is looked up on the CRAN git mirror. If a package is installed with devtools::install_github() or devtools::install() the remote or local repository location is searched for the code.

This has been tested to work with .Internal, .External, .C, .Call and Rcpp calls.

Issues

This package uses a number of heuristics to find function definitions. This means it can fail in some cases, if you find a function that is not looked up properly, please open an issue.

Thanks

lookup's People

Contributors

harrismcgehee avatar jimhester avatar maelle avatar strboul avatar wenjie2wang avatar yeedle avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

lookup's Issues

Fails to lookup functions in purrr

I get an error when lookup up functions in purrr:

> library(purrr)
> library(lookup)
> transpose
\
Error in gh::gh(...) : GitHub API error (404): 404 Not Found
  Not Found

This seems to have something to do with the fact that, while purrr uses Rcpp, it does not have RcppExports.cpp/R. Rather, it's user-exposed C functions use the C API, but lower-level functions use the Rcpp C++ library for some things.

tools::nonS3methods not found during installation

My R version is 3.2.2. The DESCRIPTION file specifies minimum requirement for R to be 3.0.0, so I thought I should be able to install the package.

My install failed on the following error.

** preparing package for lazy loading
Error : object ‘nonS3methods’ is not exported by 'namespace:tools'
ERROR: lazy loading failed for package ‘lookup’

It seems that nonS3methods is not available/exported in tools 3.2.2, but the lookup package has an importFrom tools nonS3methods in S3.R.

Unwrap sourcerefs in a temporary directory with original file layout

The temp directory would be kept around so it's only unwrapped once per session. Then ESS and RStudio can use this to jump to source for all packages with dangling srcrefs (e.g. packages installed from CRAN when R_KEEP_PKG_SOURCE is set).

Might be worth writing in pure base R and proposed for inclusion in the utils package.

Make highlight optional

Since it isn't needed by most users (who use RStudio), and development status is uncertain.

Lookup auto completion in IDE

The IDE calls print in the args of a the completion, so the lookup fails. If the function can't be found we should fallback to base::print.function

6: capture.output(print(args(obj)))
5: .rs.getSignature(object)

Submit to CRAN?

This package is incredibly useful and it would be great to see it on CRAN.

This compilation warning for the dependency {highlite} may need to be addressed along the way.

parsing error when looking up base functions

I discovered this bug. From clean R session:

> library(lookup)
> lookup(mean)
1| base::mean.Date     2| base::mean.default  3| base::mean.difftime 4| base::mean.POSIXct  5| base::mean.POSIXlt  
Which S3 method(s)? (1-5, [A]ll): 
A
Error: 'm' must be the result of 'regexpr()' with 'perl = TRUE'

A side note: Can I use your package to figure out what happened here?

rlang triple bang operator (unquote and splice) prints as triple negation

Thanks for a really useful package.

Looking for instance at lookup::lookup(dplyr:::rename.data.frame) (in dplyr 0.7.4 with new rlang NSE):

function (.data, ...) 
{
  vars <- rename_vars(names(.data), !(!(!quos(...))))
  select_impl(.data, vars)
}

Instead of https://github.com/tidyverse/dplyr/blob/41e9eb858978ca1d139047913321ac0e2a69ba5b/R/dataframe.R#L122 :

rename.data.frame <- function(.data, ...) {
  vars <- rename_vars(names(.data), !!! quos(...))
  select_impl(.data, vars)
}

Triple bang operator (!!! or UQS(), "unquote and splice", http://rlang.tidyverse.org/reference/quasiquotation.html) is mistaken for a triple nested negation (!(!(!()))).

Probably same with double bang unquote operator (!!) but didn't check though.

S3 method

methods(plot)
require(lookup)
lookup(plot.data.frame)
getS3method('plot', class='data.frame')

I’m happy to fix this one later when I have time. Thanks for a great package!

Font issue on ubuntu gnome-terminal

This looks great! Thanks.
I do have a font issue in my ubuntu gnome-terminal, making the output look like this:

lookup_font

Is there a font dependency? Maybe something osx-ish that you've built on?

lookup_browse() should work like lookup

i.e. I'd rather open source links in github (since I'm typically looking for R's C sources) and would like to share with others. It would be nice to do that in one step instead of too (lookup() + lookup_browse())

Option to always print in console

I could see myself wanting to print to console in RStudio in some cases. Perhaps we could respect something like options(lookup.in.console = TRUE) to always print in the console?

No lookup_browse/source_url for lookup::* functions

This error might already be what you meant in #20, but I thought I'd flag in case it's not:

> lookup(lookup_browse)
lookup::lookup_browse [closure]
function (x = the$last_lookup)
{
    stopifnot(inherits(x, "lookup"))
    browseURL(tail(source_url(x), n = 1))
}
<environment: namespace:lookup>

> lookup_browse(lookup(lookup_browse))
Error in browseURL(tail(source_url(x), n = 1)) :
  'url' must be a non-empty character string

> source_url(lookup(lookup_browse))
character(0)

(Thanks for the great package!)

Methods in recommended packages are not found

I'm not sure if this is a real issue or if I'm not using the package correctly, but the C-code referenced in .Call() doesn't seem to be looked up. For example:

lookup(stats::cor) doesn't give C code from
.Call(C_cor)

lookup(stats::lm.fit) doesn't give the C code from :
.Call(C_Cdqrls, x, y, tol, FALSE)

deeper

lookup(graphics::stem) prints

144 /* The R wrapper has removed NAs from x */
145 SEXP C_StemLeaf(SEXP x, SEXP scale, SEXP swidth, SEXP atom)
146 {
147     if(TYPEOF(x) != REALSXP || TYPEOF(scale) != REALSXP) error("invalid input");
148 #ifdef LONG_VECTOR_SUPPORT
149     if (IS_LONG_VEC(x))
150   error(_("long vector '%s' is not supported"), "x");
151 #endif
152     int width = asInteger(swidth), n = LENGTH(x);
153     if (n == NA_INTEGER) error(_("invalid '%s' argument"), "x");
154     if (width == NA_INTEGER) error(_("invalid '%s' argument"), "width");
155     double sc = asReal(scale), sa = asReal(atom);
156     if (!R_FINITE(sc)) error(_("invalid '%s' argument"), "scale");
157     if (!R_FINITE(sa)) error(_("invalid '%s' argument"), "atom");
158     stem_leaf(REAL(x), n, sc, width, sa);
159     return R_NilValue;
160 }

which is sanitisation/error-checking. I would really like stem_leaf, which starts on line 51 of github://wch/r-source/src/library/graphics/src/stem.c.

lookup(graphics::stem, all=TRUE) provides the same output.

d/p/q/r stats functions

Hello Jim,

When "looking up" the standard distribution functions in the stats package, I get the following:

lookup::lookup('dpois')

function (x, lambda, log = FALSE)
.Call(C_dpois, x, lambda, log)

As I understand it, the function that is displayed is the R function that is calling C_dpois which is the compiled (C) code that is actually performing the calculations. I had kind of expected that it would be the underlying C code that is displayed instead... This seems to also be the case for others, i.e. rnorm, runif, etc. Maybe this is due to my lack of understanding, or potentially a issue you haven't gotten around to tackling yet, but I just thought I'd let you know. I also had a look at the R git mirror, since you mention in the Readme that the compiled code is pulled from there, and was unable to locate the code for dpois there either (I am sure it is probably there somewhere but...). Maybe it is "hidden away" somewhere and the same reason I am struggling to find it is the same reason lookup is struggling....

Regards,
Jason

Error in loadNamespace(name): there is no package called `BiocInstaller`

I'm getting an error when trying to look up some functions from the scater Bioconductor package. It's giving me an error about BiocInstaller which shouldn't be an issue since that's been replaced with BiocManager:

lookup::lookup(scater::calculateQCMetrics)

Error in loadNamespace(name) : there is no package called ‘BiocInstaller’

sessionInfo():

R version 3.6.1 (2019-07-05)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.3 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /home/tsundoku/anaconda3/lib/libmkl_rt.so

locale:
 [1] LC_CTYPE=en_CA.UTF-8       LC_NUMERIC=C               LC_TIME=en_CA.UTF-8        LC_COLLATE=en_CA.UTF-8     LC_MONETARY=en_CA.UTF-8   
 [6] LC_MESSAGES=en_CA.UTF-8    LC_PAPER=en_CA.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  stats4    stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] scater_1.12.2               SingleCellExperiment_1.6.0  SummarizedExperiment_1.14.1 DelayedArray_0.10.0         BiocParallel_1.18.1        
 [6] matrixStats_0.55.0          Biobase_2.44.0              GenomicRanges_1.36.1        GenomeInfoDb_1.20.0         IRanges_2.18.3             
[11] S4Vectors_0.22.1            BiocGenerics_0.30.0         ggplot2_3.2.1               rlang_0.4.1                 lookup_0.0.0.9000          
[16] Seurat_3.1.1                dplyr_0.8.3                

loaded via a namespace (and not attached):
  [1] ggbeeswarm_0.6.0         Rtsne_0.15               colorspace_1.4-1         ggridges_0.5.1           XVector_0.24.0           BiocNeighbors_1.2.0     
  [7] rstudioapi_0.10          leiden_0.3.1             listenv_0.7.0            npsurv_0.4-0             ggrepel_0.8.1            codetools_0.2-16        
 [13] splines_3.6.1            R.methodsS3_1.7.1        lsei_1.2-0               zeallot_0.1.0            jsonlite_1.6             ica_1.0-2               
 [19] cluster_2.1.0            png_0.1-7                R.oo_1.22.0              uwot_0.1.4               sctransform_0.2.0        BiocManager_1.30.9      
 [25] compiler_3.6.1           httr_1.4.1               backports_1.1.5          assertthat_0.2.1         Matrix_1.2-17            lazyeval_0.2.2          
 [31] BiocSingular_1.0.0       htmltools_0.4.0          tools_3.6.1              rsvd_1.0.2               igraph_1.2.4.1           gtable_0.3.0            
 [37] glue_1.3.1               GenomeInfoDbData_1.2.1   RANN_2.6.1               reshape2_1.4.3           Rcpp_1.0.2               vctrs_0.2.0             
 [43] gdata_2.18.0             ape_5.3                  nlme_3.1-141             DelayedMatrixStats_1.6.1 gbRd_0.4-11              lmtest_0.9-37           
 [49] stringr_1.4.0            globals_0.12.4           lifecycle_0.1.0          irlba_2.3.3              gtools_3.8.1             future_1.14.0           
 [55] MASS_7.3-51.4            zlibbioc_1.30.0          zoo_1.8-6                scales_1.0.0             RColorBrewer_1.1-2       memoise_1.1.0.9000      
 [61] reticulate_1.13          pbapply_1.4-2            gridExtra_2.3            stringi_1.4.3            highlite_0.0.0.9000      caTools_1.17.1.2        
 [67] bibtex_0.4.2             Rdpack_0.11-0            SDMTools_1.1-221.1       pkgconfig_2.0.3          bitops_1.0-6             lattice_0.20-38         
 [73] ROCR_1.0-7               purrr_0.3.3              htmlwidgets_1.5.1        labeling_0.3             cowplot_1.0.0            tidyselect_0.2.5        
 [79] RcppAnnoy_0.0.13         plyr_1.8.4               magrittr_1.5             R6_2.4.0                 gplots_3.0.1.1           pillar_1.4.2            
 [85] withr_2.1.2              fitdistrplus_1.0-14      survival_2.44-1.1        RCurl_1.95-4.12          tibble_2.1.3             future.apply_1.3.0      
 [91] tsne_0.1-3               crayon_1.3.4             KernSmooth_2.23-16       plotly_4.9.0             viridis_0.5.1            grid_3.6.1              
 [97] data.table_1.12.6        metap_1.1                digest_0.6.22            tidyr_1.0.0              R.utils_2.9.0            RcppParallel_4.4.4      
[103] munsell_0.5.0            beeswarm_0.2.3           viridisLite_0.3.0        vipor_0.4.5  

Incorrect result returned for `signif`

lookup::lookup(signif)

gives me the following, which I believe has pretty much nothing to do with signif. Any ideas how to proceed?

// c source: src/main/arithmetic.c#L1604-L1648
SEXP attribute_hidden do_Math2(SEXP call, SEXP op, SEXP args, SEXP env)
{
    SEXP res, call2;
    int n, nprotect = 2;
    static SEXP do_Math2_formals = NULL;

    if (length(args) >= 2 &&
	isSymbol(CADR(args)) && R_isMissing(CADR(args), env)) {
	double digits = 0;
	if(PRIMVAL(op) == 10004) digits = 6.0; // for signif()
	PROTECT(args = list2(CAR(args), ScalarReal(digits))); nprotect++;
    }

    PROTECT(args = evalListKeepMissing(args, env));
    PROTECT(call2 = lang2(CAR(call), R_NilValue));
    SETCDR(call2, args);

    n = length(args);
    if (n != 1 && n != 2)
	error(ngettext("%d argument passed to '%s' which requires 1 or 2 arguments",
		       "%d arguments passed to '%s'which requires 1 or 2 arguments", n),
	      n, PRIMNAME(op));

    if (! DispatchGroup("Math", call2, op, args, env, &res)) {
	if(n == 1) {
	    double digits = 0.0;
	    if(PRIMVAL(op) == 10004) digits = 6.0;
	    SETCDR(args, CONS(ScalarReal(digits), R_NilValue));
	} else {
	    /* If named, do argument matching by name */
	    if (TAG(args) != R_NilValue || TAG(CDR(args)) != R_NilValue) {
		if (do_Math2_formals == NULL)
		    do_Math2_formals = allocFormalsList2(install("x"),
							 install("digits"));
		PROTECT(args = matchArgs(do_Math2_formals, args, call));
		nprotect++;
	    }
	    if (length(CADR(args)) == 0)
		errorcall(call, _("invalid second argument of length 0"));
	}
	res = do_math2(call, op, args, env);
    }
    UNPROTECT(nprotect);
    return res;
}

Issues with rstudioapi::navigateToFile and .c functions?

When I attach lookup, Rstudio triggers a navigateToFile event for no evident reason on functions that call compiled code. I can't figure out exactly what functions cause it (list does reliably, quote less so. Interpreted functions seem to be fine). It happens in both the console as well as the file edit pane. It steals focus, so it's disruptive. Perhaps it relates to auto-completion or tooltips in Rstudio calling print?

I tried to trace lookup:::print.compiled from R studio's console, but that doesn't seem to be where the Rstudio event loop runs so hasn't revealed anything. I'm also not totally confident this isn't some weird site issue for me, though it occurs when I comment out all of my .Rprofile except a call to suppressMessages(library(lookup)) (I'm unsure how make Rstudio run with --vanilla).


> sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.4

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] devtools_1.13.1   lookup_0.0.0.9000

loaded via a namespace (and not attached):
 [1] compiler_3.4.0      httr_1.2.1          R6_2.2.1            tools_3.4.0        
 [5] withr_1.0.2         rstudioapi_0.6      curl_2.6            memoise_1.1.0      
 [9] crayon_1.3.2        Rcpp_0.12.11        gh_1.0.0            codetools_0.2-15   
[13] highlite_0.0.0.9000 digest_0.6.12       jsonlite_1.4 

kapture 2017-06-01 at 18 03 30

View functions that are not exported

Hi, thank you for a super useful package. Is it possible to view functions that are not exported, e.g., those that are used by those that are?

Error in base::print.function(def) : object 'def' not found

> library(lookup)

Attaching package:lookupThe following object is masked frompackage:devtools:

    source_url

The following object is masked frompackage:base:

    print.function

> body
Error in base::print.function(def) : object 'def' not found
Session Info
Session info -------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.2 (2016-10-31)
 system   x86_64, darwin13.4.0        
 ui       X11                         
 language (EN)                        
 collate  en_US.UTF-8                 
 tz       America/Chicago             
 date     2017-01-18                  

Packages -----------------------------------------------------------------------
 package     * version    date       source                             
 codetools     0.2-15     2016-10-05 CRAN (R 3.3.2)                     
 colorout      1.1-2      2016-05-10 Github (jalvesaq/colorout@6538970) 
 crayon        1.3.2      2016-06-28 CRAN (R 3.3.0)                     
 curl          2.3        2016-11-24 CRAN (R 3.3.2)                     
 devtools    * 1.12.0     2016-06-24 CRAN (R 3.3.0)                     
 digest        0.6.11     2017-01-03 CRAN (R 3.3.2)                     
 fortunes      1.5-4      2016-12-29 CRAN (R 3.3.2)                     
 gh            1.0.0      2017-01-18 Github (gaborcsardi/gh@2be7b72)    
 highlite      0.0.0.9000 2017-01-18 Github (jimhester/highlite@767b122)
 htmltools     0.3.5      2016-03-21 CRAN (R 3.3.0)                     
 htmlwidgets   0.8        2017-01-18 local                              
 httr          1.2.1      2016-07-03 CRAN (R 3.3.0)                     
 inline        0.3.14     2015-04-13 CRAN (R 3.3.0)                     
 jsonlite      1.2        2016-12-31 cran (@1.2)                        
 lookup      * 0.0.0.9000 2017-01-18 local                              
 memoise       1.0.0.9001 2017-01-18 Github (hadley/memoise@884d565)    
 pkgload       0.0.0.9000 2016-11-09 Github (r-pkgs/pkgload@4e15842)    
 R6            2.2.0      2016-10-05 CRAN (R 3.3.0)                     
 Rcpp          0.12.9     2017-01-14 CRAN (R 3.3.2)                     
 rstudioapi    0.6        2016-06-27 CRAN (R 3.3.1)                     
 withr         1.0.2      2016-06-20 CRAN (R 3.3.0) 

Search for function usage in the wild

Or, more accurately, search for function usage in the wilds of GitHub.

@njtierney's comment in slack just reminded me of this.

lookup might be a nice home for a function that searches GitHub for usage of a function among R packages on CRAN or any other GitHub-API-able definition of "R code".

You've already got all the right dependencies and functions to do basically this:

https://gist.github.com/jennybc/4a1bf4e9e1bb3a0a9b56

There's even a first crack at the function there in the comments by @hrbrmstr.

Dreaming further, an add-in would be sweet, to help people exploit this stuff, which I look up constantly:

https://help.github.com/articles/searching-code/
https://help.github.com/articles/search-syntax/

Change package name to avoid name clash with unrelated CRAN package

An unrelated package also called lookup has just been released on CRAN. Running update.packages() or RStudio's Update packages... will give a prompt to overwrite this GitHub package. It seems that this is a popular GitHub-only package so I imagine others will have this issue.

Here are three suggestions for a new package name: readthis, readsrc, and luke (the latter based on the meme in the README).

CC'ing @maelle since she showed interest in a pkgdown site in #41. Related issue: #42.

available::available("lookup")
#> ── lookup ──────────────────────────────────────────────────────────────────────
#> Name valid: ✔
#> Available on CRAN: ✖ 
#> Available on Bioconductor: ✔
#> Available on GitHub:  ✖ 
#> Abbreviations: http://www.abbreviations.com/lookup
#> Wikipedia: https://en.wikipedia.org/wiki/lookup
#> Wiktionary: https://en.wiktionary.org/wiki/lookup
#> Sentiment:???
available::available("readthis")
#> ── readthis ────────────────────────────────────────────────────────────────────
#> Name valid: ✔
#> Available on CRAN: ✔ 
#> Available on Bioconductor: ✔
#> Available on GitHub:  ✔ 
#> Abbreviations: http://www.abbreviations.com/readthis
#> Wikipedia: https://en.wikipedia.org/wiki/readthis
#> Wiktionary: https://en.wiktionary.org/wiki/readthis
#> Sentiment:???
available::available("readsrc")
#> ── readsrc ─────────────────────────────────────────────────────────────────────
#> Name valid: ✔
#> Available on CRAN: ✔ 
#> Available on Bioconductor: ✔
#> Available on GitHub:  ✔ 
#> Abbreviations: http://www.abbreviations.com/readsrc
#> Wikipedia: https://en.wikipedia.org/wiki/readsrc
#> Wiktionary: https://en.wiktionary.org/wiki/readsrc
#> Sentiment:???
available::available("luke")
#> ── luke ────────────────────────────────────────────────────────────────────────
#> Name valid: ✔
#> Available on CRAN: ✔ 
#> Available on Bioconductor: ✔
#> Available on GitHub:  ✖ 
#> Abbreviations: http://www.abbreviations.com/luke
#> Wikipedia: https://en.wikipedia.org/wiki/luke
#> Wiktionary: https://en.wiktionary.org/wiki/luke
#> Sentiment:???

Created on 2021-05-26 by the reprex package (v2.0.0)

Use viewer in RStudio

Maybe in RStudio it would be simply better to use the viewer, providing GitHub pages embedded in a tabset? (with iframes?)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.