Ctrl+P again to print, arrows/tab to navigate results, enter to confirm

    Check out R Golfing Tips on CGSE

    Basics

    Looping

    The usual for(x in ...) is usually used, but array manipulation is often used to golf bytes off. For example:

    for(x in commandArgs(1))write(x*50,1)
    write(commandArgs(1)*50,1,1)
    

    Output

    There are two ways to output, cat and write:

    write(...,1)
    cat(...,"
    ")
    

    When outputting with paste0 to join a vector into a string by nothing:

    write(paste0(vector),1)
    cat(vector,"
    ",sep="")
    

    If you are outputting three args to cat, you can abuse the sep function, but note only strings can be used in it and that x and y cannot be vectors and have to be strings or this won't work:

    cat(x,"/",y,sep="")
    cat(x,y,sep="/")
    

    If statements

    The if statements that are commonly used:

    "if"(cond,x,y)
    c(y,x)[1+(cond)]
    

    "if" usually beats using vector indexing because you don't need to put >0, and using a list requires turning the condition into an integer and adding 1 since R uses base 1-index vectors.

    Vector indexing is occasionally used though in replacement of rep. Say we want to print a string if a condition is true:

    rep(str,cond)
    str[cond]
    

    Using [] will ensure that if the condition is true it will return the entire string and if not nothing. This works with multiple items too:

    cat(paste0(rep(c("o",str),cond)))
    cat(paste0(c("o",str)[cond]))
    cat(c("o",str)[cond],sep="")
    

    Builtins

    R, as a statistical language, has tons of builtins and functions that are very useful when golfing. Here are some of them:

    seq
    diff
    rle                # Run Length Encoding
    embed
    gl                 # Generate factors by specifying the pattern of their levels
    letters            # 'a','b','c'...
    LETTERS            # 'A','B','C'...
    month.abb          # 'Jan','Feb','Mar'...
    month.name         # 'January','February','March'...
    T                  # TRUE
    F                  # FALSE
    

    T and F are very powerful because you don't need to initialize a variable to 1 or 0 at the start of your code.

    Aliases

    We can define short aliases for functions using backticks for two arguments using primitive operators:

    `+`=paste
    x+y                # paste(x,y)
    

    (There is a way to define a short alias for functions with 3 or more arguments)

    Coercion

    Some examples of using coercion to avoid using long functions:

    as.integer("19")
    ("19":1)[1]
    el("19":1)
    
    as.character(19)
    paste(19)
    

    outer function

    outer is a fairly strong function. It takes the two arrays and applies a vectorized function. It acts like Julia's array manipulation feature:

    x=1:3
    println(x*x')
    
    # [1 2 3; 2 4 6; 3 6 9]
    

    In R:

    x=1:3
    write(outer(x,x,"*"),1)
    
    # 1 2 3 2 4 6 3 6 9
    

    You can place any operator or function (with quotes around it) in the third argument for outer.

    outer(X,Y,"*") can also be rewritten as:

    X%*%t(Y)           # %*% is matrix vector multiplication
    

    Or even better:

    X%o%Y
    

    rep() alternatives

    Even though rep() is already fairly short, we can save a few more bytes by using : and vector recycling.

    Repeating n zeroes (n>0) - !1:n or 0*1:n instead of rep(0,n)

    Repeating n ones - !!1:n instead of rep(1,n)

    Repeating x n times - x+!1:n instead of rep(x,n)

    Using modular arithmetic to avoid each args in rep

    There aren't too many uses of this, but when you encounter one, you will probably need some creativity to come up with some "formula".

    Generating the vector c(-1,-1,-1,0,0,0,1,1,1) is easily done with rep(-1:1,e=3), but you can use modular arithmetic to save bytes:

    -3:5%/%3
    

    Random Tips

    Packers

    3:1

    eval(parse(t=intToUtf8(outer(utf8ToInt("..."),97:99,`%%`)+32)))
    

    2:1

    eval(parse(t=iconv("...",,"utf16")))