4
votes

To start off, I'm not really sure what the difference between paste and print is. But I am using "print" to spit out generic statements and "paste" to spit out statements that use/ reference specific variables.

My issue is that when using paste within a function, I am losing my pasted output if there is anything included in the function following the "paste" statement.

Please see the following three functions:

TS<-5

Example 1- everything works fine

T<-function(){

if(exists("TS"))
{paste("TS= ", TS, sep=" ")}

else

if(!exists("TS"))
{print.noquote("No TS Values")}

}

Example 2- My Problem. When I add anything (in this case another print command) following my "if" statement I will lose my pasted output

T<-function(){

if(exists("TS"))
{paste("TS= ", TS, sep=" ")}

else

if(!exists("TS"))
{print.noquote("No TS Values")}

print("my exsistance removes paste output") 

}

Example 3- The same statement placed before the "if" has no negative effect

T<-function(){

print("my exsistance does not remove paste output")

if(exists("TS"))
{paste("TS= ", TS, sep=" ")}

else

if(!exists("TS"))
{print.noquote("No TS Values")}


}

Can someone explain where the conflict is within this function. And better yet how can I work around it so that I can have a paste statement followed by other actions within a function

basically how can I get example #2 to work.

Brownie points- (for sake of visual consistency) when using "print.noquote", is there such a thing as a paste.noquote?

2
use print, cat, or better yet, message if you want text to be echoed. paste is only used to concatenate strings; it will be echoed as a side-effect iff it is the last statement of a function with no explicit return value.baptiste
@ttmaccer That wouldn't cause a random paste statement to print to the console though. It's useful if you're printing inside of a loop though...Dason

2 Answers

8
votes

paste concatenates (pastes) strings and returns a character vector, so you can do thing like

paste('a','b', sep = '-')

## [1] "a-b"

print prints values. From ?print

print prints its argument and returns it invisibly (via invisible(x)). It is a generic function which means that new printing methods can be easily added for new classes.

Most classes will have a defined print method (or will use print.default)

You can see the available print methods by typing

methods('print')

In your case paste("TS= ", TS, sep=" ") returns a character vector, so when this is the result of the function, print.character is used to display the results

In fact, I think you want message not print or print.noquote.

T <- function() {
    if (exists("TS"))
    {
        message(paste("TS= ", TS, sep=" "))
    } else if (!exists("TS")) {
        message("No TS Values")
    }
    message("my exsistance removes paste output") 
}
4
votes

paste returns the input concatenated together. When a function returns it calls print on whatever was returned if it isn't stored into a variable. Functions return the last top level call if there is no explicit 'return' or 'invisible' statement.

All of these things add up to what you end up seeing. If paste is the last function called it ends up returning the input concatenated together - which ends up being returned by the function - which ends up being printed since you don't save it into a variable. If you explicitly want something printed it is best to use print or message or cat - they each serve slightly different purposes.