2012-06-09 18 views
24

Sto utilizzando Ubuntu 11.10 e vorrei poter scrivere negli appunti (o nella selezione primaria). Di seguito dà un erroreCome scrivere negli appunti su Ubuntu/Linux in R?

> x <- 1:10 
> dput(x, 'clipboard') 
Error in file(file, "wt") : 'mode' for the clipboard must be 'r' on Unix 

Come posso scrivere negli appunti selezione/primaria?

Nota che ho visto this old R-Help post, ma non sono ancora chiaro cosa dovrei fare.

Linux non ha un blocco appunti ma una sessione X11 ha selezioni secondarie e secondarie. ? Lima dice

Appunti:

'file' can also be used with 'description = "clipboard"' in mode 
    '"r"' only. It reads the X11 primary selection, which can also be 
    specified as '"X11_primary"' and the secondary selection as 
    '"X11_secondary"'. 

    When the clipboard is opened for reading, the contents are 
    immediately copied to internal storage in the connection. 

    Unix users wishing to _write_ to the primary selection may be able 
    to do so via 'xclip' (<URL: 
    http://people.debian.org/~kims/xclip/>), for example by 
    'pipe("xclip -i", "w")'. 

così RTFM applicato. Scrivere su una selezione X11 richiede più thread e non pensavo che valesse la pena considerevole dell'impegno di implementazione (a differenza di Windows).

Si noti che i gestori di finestre possono avere altri blocchi di appunti, e ad esempio il pacchetto RGtk2 ha interfacce per gli appunti di gtk.

risposta

12

Non so se questo è il modo migliore , ma ecco come ho potuto farlo funzionare:

  1. Installare xclip: sudo apt-get install xclip
  2. , leggere le istruzioni: man xclip
  3. Scrivici X11 primario in R: write.table(1:10, pipe("xclip -i", "w"))

Aggiornamento:

noti che l'oggetto passato write.table non sarà presente nella clipboard finché il tubo viene chiuso. È possibile forzare la chiusura del tubo chiamando gc(). Ad esempio:

write.table(1:10, pipe("xclip -i", "w")) # data may not be in clipboard 
gc()          # data written to primary clipboard 

Un modo migliore per gestire la connessione è quello di utilizzare una funzione con on.exit(close(con)), che chiuderà il tubo anche se la chiamata write.table genera un errore. Nota che devi assicurarti di scrivere negli appunti che intendi utilizzare (primario è il predefinito), in base alla configurazione del tuo sistema.

write.xclip <- function(x, selection=c("primary", "secondary", "clipboard"), ...) { 
    if (!isTRUE(file.exists(Sys.which("xclip")[1L]))) 
    stop("Cannot find xclip") 
    selection <- match.arg(selection)[1L] 
    con <- pipe(paste0("xclip -i -selection ", selection), "w") 
    on.exit(close(con)) 
    write.table(x, con, ...) 
} 
+0

+1 Grazie. Lo apprezzo. Sono ancora interessato a vedere quali altre strategie esistono. Il motivo principale per cui a volte mi piace incollare negli appunti è di salvare un paio di secondi, invece di scrivere su un file e copiare dal file. La strategia di cui sopra sembra presumere che io possa prevedere in anticipo che avrei bisogno degli appunti. Inoltre, non ho potuto farlo funzionare in R Studio. Potrei farlo funzionare solo con la console. –

+0

@JeromyAnglim Ho anche notato che si trattava di un problema di RStudio, quindi è consigliabile presentarsi agli sviluppatori di RStudio. Non so cosa hanno fatto con gli appunti. –

+1

Questo non ha funzionato per me in Ubuntu, in R Studio o nella versione terminale di R. Ammetto che non ho letto completamente l'uomo per xclip (passaggio 2), ma non penso che dovrebbe influenzare i risultati. – geneorama

16
clipboard <- function(x, sep="\t", row.names=FALSE, col.names=TRUE){ 
    con <- pipe("xclip -selection clipboard -i", open="w") 
    write.table(x, con, sep=sep, row.names=row.names, col.names=col.names) 
    close(con) 
} 

vec <- c(1,2,3,4) 

clipboard(vec) 
clipboard(vec, ",", col.names=FALSE) 
clipboard(vec, " ", row.names=TRUE) 

È possibile incollare di nuovo tutto ciò che si scrive negli appunti dopo aver creato la funzione in quanto tale. Valori di default della tabulazione dei valori restituiti con colonna ma nessun nome di riga. Specificare altri separatori, includere i nomi di riga o escludere i nomi delle colonne come desiderato.

Modifica: per chiarire, è comunque necessario installare xclip. Non è necessario prima avviarlo separatamente, però.

+0

Nessuna di queste soluzioni funziona per me :-( –

0

Versioni:

  • Mint 18.1, cannella
  • xclip 0,12
  • R 3.4.0 (2017-04-21)

non ho potuto ottenere le altre soluzioni per lavorare , quindi I man su. Questo approccio funziona per me (basato sulle soluzioni degli altri).

write_clipboard = function(x, .rownames = F) { 
    #decide how to write 
    #windows is easy! 
    if (Sys.info()['sysname'] %in% c("Windows")) { 
     #just write as normal 
     write.table(x, "clipboard", sep = "\t", na = "", row.names = F) 
    } else { 
     #for non-windows, try xclip approach 
     #https://stackoverflow.com/a/10960498/3980197 
     write.xclip = function(x) { 
     #if xclip not installed 
     if (!isTRUE(file.exists(Sys.which("xclip")[1L]))) { 
      stop("Cannot find xclip") 
     } 
     con <- pipe("xclip -selection c", "w") 
     on.exit(close(con)) 
     write.table(x, con, sep = "\t", na = "", row.names = F) 
     } 

     tryCatch({ 
     write.xclip(x) 
     }, error = function(e) { 
     message("Could not write using xclip") 
     }) 
    } 
} 

Si tratta di una versione annacquata di una funzione in my personal R package.

Lettura dal clipboard

lettura è altrettanto difficile. Ecco una funzione complementare per quanto sopra.

read_clipboard = function(header = T, 
          sep = "\t", 
          na.strings = c("", "NA"), 
          check.names = T, 
          stringsAsFactors = F, 
          dec = ".", 
          ...) { 
    #decide how to read 
    #windows is easy! 
    if (Sys.info()['sysname'] %in% c("Windows")) { 
    #just read as normal 
    read.table(file = con, sep = sep, header = header, check.names = check.names, na.strings = na.strings, stringsAsFactors = stringsAsFactors, dec = dec, ...) 
    } else { 
    #for non-windows, try xclip approach 
    #https://stackoverflow.com/a/10960498/3980197 
    read.xclip = function(x) { 
     #if xclip not installed 
     if (!isTRUE(file.exists(Sys.which("xclip")[1L]))) { 
     stop("Cannot find xclip") 
     } 
     con <- pipe("xclip -o -selection c", "r") 
     on.exit(close(con)) 
     read.table(file = con, sep = sep, header = header, check.names = check.names, na.strings = na.strings, stringsAsFactors = stringsAsFactors, dec = dec, ...) 
    } 

    tryCatch({ 
     read.xclip(x) 
    }, error = function(e) { 
     message(sprintf("error: %s", e$message)) 
    }) 
    } 
}