缩进代码行'n'个空格

时间:2011-11-18 05:01:24

标签: r

对于要在此处识别为代码的代码,它必须缩进四个空格。这可以通过手工或括号图标或刻度标记来完成。如果我想通过R实现这一目标怎么办?显然这可以做到(只看格式R)。用最少的代码编写来解决这个问题的方法是什么?

因此,对于以下行(数据帧和函数),使用R将每行精确缩进4个空格的最佳方法(最少量的代码)是什么?

foo<-function(x,y){
   z<-x*y
   super.z<-z^2
   return(super.z)
}

     id hs.grad  race gender age
1   ID1     yes asian female  32
2   ID2     yes white female  30
3   ID3     yes white female  34
4   ID4     yes black female  25
5   ID5      no white   male  19

4 个答案:

答案 0 :(得分:4)

这是一个小函数,它将以StackOverflow兼容的方式格式化对象:

formatSO <- function(x) {
  y <- get(x, parent.frame())
  d <- deparse(y)

  cat("   ", x, "<-", d[1], "\n")
  cat(paste("    ", d[-1], "\n", sep=""), sep="")
}

尝试一下:

> foo<-function(x,y){
+    z<-x*y
+    super.z<-z^2
+    return(super.z)
+ }
> formatSO("foo")
    foo <- function (x, y)  
    {
        z <- x * y
        super.z <- z^2
        return(super.z)
    }
> x <- 5:3
> formatSO("x")
    x <- c(5L, 4L, 3L) 

答案 1 :(得分:3)

设置

options(prompt = "    ")

将导致您在控制台中编写的任何代码都被格式化,以便在此处轻松粘贴。虽然输出在开头不会有四个空格,但可能需要不同的解决方法。

答案 2 :(得分:2)

formatR: Format R Code Automatically可用于此目的。可用here

library(formatR)
src <- c("foo<-function(x,y){
   z<-x*y


              super.z<-z^2
   return(super.z)
}
")

tidy.source(text = src, replace.assign = TRUE)


foo <- function(x, y) {
    z <- x * y
    super.z <- z^2
    return(super.z)
} 

答案 3 :(得分:1)

我决定今天浪费我的时间实际上正如我所描述的那样完成这个功能。我已经创建了一个带有数据帧或函数的函数,可以将输入或剪切板输入到缩进函数中。这将使用space参数缩进代码所需的空格(默认为四个空格)。

indent <- function(object = "clipboard", space = 4) {        
    y <- if (object == "clipboard") {                        
        as.list(readClipboard())                             
    } else {                                                 
        strsplit(as.vector(object), "[\\n]")                 
    }                                                        
    spacer <- function(x) paste(paste(rep(" ", space - 2),   
        collapse = ""), x)                                   
    z <- if (object == "clipboard") {                        
        sapply(y, spacer)                                    
    } else {                                                 
        lapply(y, spacer)                                    
    }                                                        
    zz <- as.matrix(as.data.frame(z))                        
    dimnames(zz) <- list(c(rep("", nrow(zz))), c(""))        
    noquote(zz)                                              
}                                                            
#==========================================================  
#   Test it out!!!!!!                                        
#==========================================================  
indent("     id hs.grad  race gender age                     
1   ID1     yes white   male  37                             
2   ID2     yes white   male  32                             
3   ID3     yes asian   male  20                             
4   ID4      no black female  24                             
5   ID5      no white female  32")                           
#==========================================================  
indent("ascii<-function(x, header=TRUE,...){                 
      name <-textConnection(x)                               
      DF <- read.table(name, header, ...)                    
      close(name)                                            
      on.exit(closeAllConnections())                         
      DF                                                     
}", space = 10)                                              
#============================================================
#  THE NEXT TWO CAN BE CUT AND PASTED WITH THE CLIPBOARD ARG 
#============================================================
     id hs.grad  race gender age                             
1   ID1     yes white   male  37                             
2   ID2     yes white   male  32                             
3   ID3     yes asian   male  20                             
4   ID4      no black female  24                             
5   ID5      no white female  32                             

indent("clipboard")                                          
#============================================================
ascii<-function(x, header=TRUE,...){                         
      name <-textConnection(x)                               
      DF <- read.table(name, header, ...)                    
      close(name)                                            
      on.exit(closeAllConnections())                         
      DF                                                     
}                                                            

indent()  #clipboard is the default arg not needed