Introducción

Estar trabajando en una planilla de cálculo y pasar rápidamente los datos a R suele ser algo poco práctico en la mayoría de las veces. Por este motivo, desarrolle una función que me permita copiar y pegar datos directamente a la consola de R.

La función invoca una ventana de shiny y permite pegar valores provenientes de cualquier planilla de cálculo.

Obtener la función

La función puede obtenerse fácilmente desde el siguiente Link. Luego de descargar el archivo .rds, crear la función es muy fácil:

readRDS("subir_clipboard.rds")->subir_clipboard

Ejemplo de Uso

Se llama a la función:

subir_clipboard()

Aparece la siguiente pantalla:

Se le pegan los datos que se desean subir:

Se obtiene el data.frame:

##          country    1800    1801    1802
##   1: Afghanistan 3280000 3280000 3280000
##   2:     Albania  410000  412000  413000
##   3:     Algeria 2500000 2510000 2520000
##   4:     Andorra    2650    2650    2650
##   5:      Angola 1570000 1570000 1570000
##  ---                                    
## 191:   Venezuela  718000  718000  718000
## 192:     Vietnam 6550000 6550000 6550000
## 193:       Yemen 2590000 2590000 2590000
## 194:      Zambia  747000  747000  747000
## 195:    Zimbabwe 1090000 1090000 1090000

Código de la Función

subir_clipboard <- function() {
  
  require(shiny)
  require(shinyWidgets)
  require(stringr)
  require(data.table)
  
  runApp(list(  
  ui = fluidPage(
      fluidRow(column(3),
               column(6,
                      tags$h1("Pega tus datos"),
                      textAreaInput("datos","","",
                                    width = 500,height = 300),
                      textInput("sepdec","Separador de decimal:",","),
                      actionBttn(
                        inputId = "go",
                        label = "Subir Datos",
                        style = "jelly", 
                        color = "primary",
                        icon = icon("upload")
                      )
                      ))
      
    ),
    
    server = function(input, output, session) {
      
      observeEvent(input$go,{
        
        
        texto<-input$datos
        str_split(texto,"\n")[[1]]->kk
        str_split(kk,"\t")->l
        
        
        if (length(l[[length(l)]])==1) {
          if (l[[length(l)]]=="") { 
            l<-l[-length(l)]
          }}
        
        
        rdo<-lapply(l[-1], function(x) {
          return(as.data.table(t(x)))
        })
        
        
        
        rbindlist(rdo)->rdo2
        
        
        m<-lapply(rdo2, function(x) {
          as.character(x)->x
          x<-ifelse(x=="",NA,x)
          y<-as.numeric(str_replace(x,input$sepdec,".") )
          if (sum(is.na(y))>0) {y<-x}
          return(y)
        })
        
        m<-as.data.frame(m)
        names(m)<-l[[1]]  

        stopApp(m)})
      
    }
    ))
}