16

Excel で小さな R テーブル/ベクター オブジェクトをすばやく開くにはどうすればよいですか?

たとえば、Excel で表示する次の 3 つのオブジェクトがあるとします。

## A data frame with commas and quotes
df = data.frame(
  area = unname(state.x77[,'Area']),
  frost = unname(state.x77[,'Frost']),
  comments = "Ok for a visit, but don't want to live there",
  challengeComments = c('"', '""'))
row.names(df) = state.name
df = df[1:10, ]
df['California', 'comments'] = "Would like to live here"

## A Matrix
mat = matrix(rnorm(100), 10)

## A Vector
v = 1:10
4

10 に答える 10

14

そのタスクを達成するためにこの関数を書きました。私はそれを「書き込み一時ファイル」または「wtf」と呼んでいます。Excelに関連付けられたcsvファイルがある場合、Windowsでのみ機能します。

PBSmodelling::openFile のコードを見て、さまざまなオペレーティング システムに適用する方法を確認できます。

wtf = function (x) {
  tempFilePath = paste(tempfile(), ".csv")
  tempPath = dirname(tempFilePath)
  preferredFile = paste(deparse(substitute(x)), ".csv", sep = "")
  preferredFilePath = file.path(tempPath, preferredFile)

  if(length(dim(x))>2){
    stop('Too many dimensions')
  }
  if(is.null(dim(x))){
    x = as.data.frame(x)
  }
  if (is.null(rownames(x))) {
    tmp = 1:nrow(x)
  }else {
    tmp = rownames(x)
  }
  rownames(x) = NULL
  x = data.frame(RowLabels = tmp, x)
  WriteAttempt = try(
    write.table(x, file=preferredFilePath, quote=TRUE, sep=",", na="",
                row.names=FALSE, qmethod="double"),
    silent = TRUE)
  if ("try-error" %in% class(WriteAttempt)) {
    write.table(x, file=tempFilePath, , quote=TRUE, sep=",", na="",
                row.names=FALSE, qmethod="double")
    shell.exec(tempFilePath)
  } else {
    shell.exec(preferredFilePath)
  }
}


wtf(df)
wtf(mat)
wtf(v)

同じオブジェクトを複数回開いた場合でも、エラー処理のおかげで機能しますが、一時的な名前が乱雑になります。

wtf(df)
df$MoreData = pi
wtf(df)
于 2012-08-28T18:00:15.687 に答える
3

LibreOfficeCalcまたはExcelでファイルを開く関数を作成しました。詳細はこちらをご覧ください

view <- function(data, autofilter=TRUE) {
    # data: data frame
    # autofilter: whether to apply a filter to make sorting and filtering easier
    open_command <- switch(Sys.info()[['sysname']],
                           Windows= 'open',
                           Linux  = 'xdg-open',
                           Darwin = 'open')
    require(XLConnect)
    temp_file <- paste0(tempfile(), '.xlsx')
    wb <- loadWorkbook(temp_file, create = TRUE)
    createSheet(wb, name = "temp")
    writeWorksheet(wb, data, sheet = "temp", startRow = 1, startCol = 1)
    if (autofilter) setAutoFilter(wb, 'temp', aref('A1', dim(data)))
    saveWorkbook(wb, )
    system(paste(open_command, temp_file))
}
于 2012-10-18T07:01:03.350 に答える
1

恥知らずな広告でごめんなさい...あなたは私のパッケージを試すことができますhttp://cran.r-project.org/web/packages/excel.link/index.html それは次のように見えます:

library(excel.link)
xlrc[a1]=df

Omegahat RDCOMClientパッケージに依存するため、ソースからインストールする必要があります。

install.packages("RDCOMClient", repos = "http://www.omegahat.org/R")
install.packages("excel.link", repos = "http://cran.at.r-project.org",type="source")
于 2012-08-28T22:01:17.567 に答える
1

これをよく使用して、データの表を Excel に貼り付けます。

write.table(x, "clipboard", row.names=F, sep='\t')

(サブ) テーブルを Excel から R にコピーするには、次のようにします (テーブルにヘッダー行があると仮定します)。

read.csv('clipboard', sep='\t')
于 2016-02-11T03:51:30.523 に答える
0

Windows用の関数を書きました。しかし、おそらく他のオペレーティング システムでも動作します。

C:\Users\...\Documents\Rview に一時ファイルを作成し、browseURL() で開きます。最大 99 個のファイルを同時に開くことができます。引数 "names" によって、どのディムネームを表示するかを簡単に選択できます。この関数は、col/rownames の +、-、= の前に ' を追加するため、Excel で適切に表示されます。

個人的には、 tempfile() を使用するよりも Sys.getenv("TMP") を使用するソリューションを好みます。これは、tempfile() が一定期間後に一時ファイル フォルダーを台無しにするためです。

詳細については、コードの上部にある引数の説明を参照してください。

# This function creates a CSV file from a data.frame/matrix and opens it with the default CSV-opening-program
# of the computer.
#
# x = data.frame/matrix
# names = dimnames to be saved in the file. "col"=colnames, "rowcol"=rownames&colnames, "row"=rownames, "no"=no dimnames
# nrows = maximum number of rows    to be saved (for higher speed with large datasets)
#         if n=-1, all rows will be displayed.-> see also the help for read.table()
# ncols = maximum number of columns to be saved (for higher speed with large datasets)
# folder = directory, where the temporary file should be saved.
#          If NULL an accessible folder in C:/Users/.../Documents will be created automatically.
# quote = should quotes be written into the csv File? -> see also the help for write.table()
# na = how should NA values be displayed in the csv File? -> see also the help for write.table()
# openfolder = Should the folder with all temporary files be opened after having created the file?

view <- function(x, names=c("col","rowcol","row","no"), nrows=10000, ncols=1000, folder=NULL, quote=FALSE, na="NA", openfolder=FALSE, ...){

  names <- match.arg(names)
  if(is.null(dim(x))) {
    x <- as.matrix(x)
  }
  if(is.null(colnames(x))) colnames(x) <- paste0("V",1:ncol(x))

  if(nrows<0) nrows <- nrow(x)
  if(ncols<0) ncols <- ncol(x)
  # Shrink data.frame such that it can be saved & viewed faster.
  nrows <- min(nrow(x), nrows)
  if(nrows!=nrow(x)) x <- x[1:nrows,,drop=FALSE]
  ncols <- min(ncol(x), ncols)
  if(ncols!=ncol(x)) x <- x[,1:ncols,drop=FALSE]


  # Define paths
  # If is.null(folder), wird ein temporaerer Ordner im Windows-Dateisystem angelegt.
  if(is.null(folder)) {
    folder <- paste0(Sys.getenv("TMP"), "\\Rview")
    suppressWarnings( dir.create(folder) )
  }  

  # Wenn am Schluss des Pfades kein "/" angefuegt wurde, wird dies gemacht:
  if( !substr(folder,nchar(folder),nchar(folder))%in%c("/","\\") ) folder <- paste0(folder, "\\")
  pfad0 <- folder
  name <- "Rview_tmp"
  nr <- "01"
  csv <- ".csv"

  # Check if there are existing files in the folder
  fil <- list.files(pfad0)
  # If there are no files in the folder, use the default save path.
  if(length(fil)==0){
    pfad1 <- paste0(pfad0, name, nr, csv)
  } else {
    # Remove all files in the folder (if possible)
    fil <- paste0(pfad0, fil)
    suppressWarnings( try( file.remove( fil )  , silent=TRUE) )
    fil <- list.files(pfad0)
    # If there are no files anymore use the default save path.
    if( length(fil)==0 ) {
      pfad1 <- paste0(pfad0, name, nr, csv)
    } else {
      # If there are sill files, read out the number of the newest file (with the highest number)
      ncharfil <- nchar(fil)
      mx <- max( as.numeric( substr(fil,ncharfil-5,ncharfil-4) ) )
      # Add 1 to the number of the file
      mxpl1 <- as.character( mx+1 )
      if(nchar(mxpl1)==1) mxpl1 <- paste0("0",mxpl1)
      # Create a new path
      pfad1 <- paste0(pfad0, name, mxpl1, csv)
    }
  }

  # Rownames und colnames, die mit +, - oder = anfangen, mit ' am Anfang versehen, dass es von Excel richtig dargestellt wird
  rn1 <- rownames(x)
  cn1 <- colnames(x)
  ind <- substr(rn1,1,1)%in%c("+","-","=")
  if(any(ind)) rownames(x)[ind] <- paste0(" ",rn1[ind])
  ind <- substr(cn1,1,1)%in%c("+","-","=")
  if(any(ind)) colnames(x)[ind] <- paste0(" ",cn1[ind])

  # Write CSV file & open.
  if(names=="row") {
    # If the first cell of the file is named "ID" Microsoft Excel warns that a SYLK file is opened. Therefore it is renamed.
    if(rownames(x)[1]=="ID") rownames(x)[1] <- "lD"
    write.table(x, file=pfad1, sep = ";", col.names=FALSE, row.names=TRUE, quote=quote, na=na, ...)
  } else if (names=="col") {
    # If the first cell of the file is named "ID" Microsoft Excel warns that a SYLK file is opened. Therefore it is renamed.
    if(colnames(x)[1]=="ID") colnames(x)[1] <- "lD"
    write.table(x, file=pfad1, sep = ";", col.names=TRUE, row.names=FALSE, quote=quote, na=na, ...)
  } else if (names=="rowcol") {
    write.table(x, file=pfad1, sep = ";", col.names=NA)                    # Colnames & Rownames
  } else {
    write.table(x, file=pfad1, sep = ";", col.names=FALSE, row.names=FALSE, quote=quote, na=na, ...)
  }

  browseURL(pfad1)
  if(openfolder) {
    Sys.sleep(1)
    browseURL(folder)
  }
}
于 2016-02-26T15:52:43.153 に答える
-2

write.csv(x, "clipboard")エクセルに貼って使います。

于 2012-08-28T19:48:10.183 に答える