who to direct suggestions to about a reprex-like alternative to 'dput()'?

It occurs to me that a kind of pre-reprex, reprex-like utility for sharing data would be helpful; specifically, something that produces dput()-like output, but which interacts with the clipboard.

For example, it could be a function called, say, reprex_share() that mimics the result of running this code (or something like it):

library(tidyverse)
deparse(mtcars) %>% 
  str_c(collapse = '') %>% 
  str_replace_all('\\s+', ' ') %>% 
  str_replace_all('\\s*([^,\\()]+ =) (c\\()', '\n  \\1\n    \\2')  %>% 
  str_replace_all('(,) (class =)', '\\1\n  \\2') %>% 
  cat()

which attempts to prevent rightward sprawl of dput() output and sends its output to the console, which is then placed on the clipboard in the form:

```
mtcars <- 
  structure(list(
    mpg =
      c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14.7, 32.4, 30.4, 33.9, 21.5, 15.5, 15.2, 13.3, 19.2, 27.3, 26, 30.4, 15.8, 19.7, 15, 21.4),
    cyl =
      c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 8, 6, 8, 4),
    disp =
      c(160, 160, 108, 258, 360, 225, 360, 146.7, 140.8, 167.6, 167.6, 275.8, 275.8, 275.8, 472, 460, 440, 78.7, 75.7, 71.1, 120.1, 318, 304, 350, 400, 79, 120.3, 95.1, 351, 145, 301, 121),
    hp =
      c(110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215, 230, 66, 52, 65, 97, 150, 150, 245, 175, 66, 91, 113, 264, 175, 335, 109),
    drat =
      c(3.9, 3.9, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.07, 3.07, 2.93, 3, 3.23, 4.08, 4.93, 4.22, 3.7, 2.76, 3.15, 3.73, 3.08, 4.08, 4.43, 3.77, 4.22, 3.62, 3.54, 4.11 ),
    wt =
      c(2.62, 2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44, 3.44, 4.07, 3.73, 3.78, 5.25, 5.424, 5.345, 2.2, 1.615, 1.835, 2.465, 3.52, 3.435, 3.84, 3.845, 1.935, 2.14, 1.513, 3.17, 2.77, 3.57, 2.78),
    qsec =
      c(16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20, 22.9, 18.3, 18.9, 17.4, 17.6, 18, 17.98, 17.82, 17.42, 19.47, 18.52, 19.9, 20.01, 16.87, 17.3, 15.41, 17.05, 18.9, 16.7, 16.9, 14.5, 15.5, 14.6, 18.6 ),
    vs =
      c(0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1),
    am =
      c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1),
    gear =
      c(4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 4),
    carb =
      c(4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, 1, 2, 2, 4, 6, 8, 2)),
    row.names =
      c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Valiant", "Duster 360", "Merc 240D", "Merc 230", "Merc 280", "Merc 280C", "Merc 450SE", "Merc 450SL", "Merc 450SLC", "Cadillac Fleetwood", "Lincoln Continental", "Chrysler Imperial", "Fiat 128", "Honda Civic", "Toyota Corolla", "Toyota Corona", "Dodge Challenger", "AMC Javelin", "Camaro Z28", "Pontiac Firebird", "Fiat X1-9", "Porsche 914-2", "Lotus Europa", "Ford Pantera L", "Ferrari Dino", "Maserati Bora", "Volvo 142E"),
    class = "data.frame")
```

That way a user who is new to R and RStudio could simply run reprex_share(my_table) and easily paste their data into a post here.

Not sure how complicated this would be to implement, but seems like a natural addition to the reprex package as stepping stone towards learning how to create a fully-fledged reprex.

require(clipr)
#> Loading required package: clipr
#> Welcome to clipr. See ?write_clip for advisories on writing to the clipboard in R.
require(magrittr)
#> Loading required package: magrittr
require(stringr)
#> Loading required package: stringr

specimen <- function(x)
  deparse(x) %>% 
  str_c(collapse = '') %>% 
  str_replace_all('\\s+', ' ') %>% 
  str_replace_all('\\s*([^,\\()]+ =) (c\\()', '\n  \\1\n    \\2')  %>% 
  str_replace_all('(,) (class =)', '\\1\n  \\2') %>% 
  write_clip(allow_non_interactive = TRUE)
  
specimen(mtcars)

Created on 2020-03-25 by the reprex package (v0.3.0)

datapasta has a couple of functions which do something similiar to what I think you're asking for:

datapasta::tribble_paste(head(mtcars))
#> tibble::tribble(
#>   ~mpg, ~cyl, ~disp, ~hp, ~drat,   ~wt, ~qsec, ~vs, ~am, ~gear, ~carb,
#>     21,    6,   160, 110,   3.9,  2.62, 16.46,   0,   1,     4,     4,
#>     21,    6,   160, 110,   3.9, 2.875, 17.02,   0,   1,     4,     4,
#>   22.8,    4,   108,  93,  3.85,  2.32, 18.61,   1,   1,     4,     1,
#>   21.4,    6,   258, 110,  3.08, 3.215, 19.44,   1,   0,     3,     1,
#>   18.7,    8,   360, 175,  3.15,  3.44, 17.02,   0,   0,     3,     2,
#>   18.1,    6,   225, 105,  2.76,  3.46, 20.22,   1,   0,     3,     1
#>   )

There's also df_paste() and dt_paste().

Thanks @mrblobby and @technocrat: My question partly about a way to have such a function require almost no additional steps (like installing a package) on the part of someone who is completely new to R and RStudio and so may be easily overwhelmed by unfamiliar code or steps to be taken.

I think the reprex package comes with RStudio 'out of the box', so a new user could be directed to run reprex::reprex_share(my_table), or datapasta::tribble_paste(my_table)), if the datapasta package came with an RStudio installation.

Looks like this idea has been brought up previously over here: https://github.com/tidyverse/reprex/issues/280

1 Like

An initiate is going to have to learn to install packages eventually and a specimen-like single-function library is about the simplest to implement, understand and use solution I could think of.

1 Like

Cool! My eyes slid over the require() commands, so I didn't realize what you were suggesting -- I don't know a thing about writing packages, so not sure about next steps, but you're right: one stone to rule three birds!

I'll take a look at the github link @mrblobby shared, too, to see what was suggested there...

1 Like

RStudio comes with no package out of the box since it is an IDE for R, and reprex is not a base R package, so they would have to install a package anyways and I agree with @technocrat that learning to install packages is a basic skill you have to learn better sooner than later.

Also, for those extreme cases where the poster can't even install a package, there are more suitable learning resources to start from zero than this forum like e.g. the R4DS community. Sustainers have been asked to selectively direct these cases to an R4DS Slack group that offers personal tutoring.

1 Like

I didn't think it came installed, but I thought it showed up in the 'Addins' menu without having to install it for use on the command line.

I've come across a good number of these here, which is why the thought occurred to me, but I didn't know about the R4DS Slack group -- good to know!

1 Like

Addins are not built-in functionalities of the IDE they come from packages if there is no package installed there is no addin.

Thanks for clarifying that, @andresrcs.

How does a package find its way into the Addins menu? I assume it's something in the package configuration, but I'm not sure.

If the package provides an add-in, then it appears at the menu automatically but not all packages provide an add-in.

1 Like