Hi @eb1058, cute package! 
I didn't manage to get something to work in the x <- say() format, but capture.output() gets pretty close.
> capture.output(say(), type = "message")
[1] "" " -------------- "
[3] "Hello world! " " --------------"
[5] " \\" " \\"
[7] " \\" " |\\___/|"
[9] " ==) ^Y^ (==" " \\ ^ /"
[11] " )=*=(" " / \\"
[13] " | |" " /| | | |\\"
[15] " \\| | |_|/\\" " jgs //_// ___/"
[17] " \\_)" " "
I don't know if this is a good enough work around?
> x <- capture.output(say(), type = "message")
> cat(x, sep = "\n")
--------------
Hello world!
--------------
\
\
\
|\___/|
==) ^Y^ (==
\ ^ /
)=*=(
/ \
| |
/| | | |\
\| | |_|/\
jgs //_// ___/
\_)
I have to admit, the capture.output help page says "Messages sent to stderr() (including those from message, warning and stop) are captured by type = "message". Note that this can be “unsafe” and should only be used with care.", so I'm not sure when you should or shouldn't use it..
Good luck! 
Edit:
I think I've found a better solution 
> say('time', type = "string")
[1] "\n -------------- \n2018-03-13 13:25:12 \n --------------\n \\\n \\\n \\\n |\\___/|\n ==) ^Y^ (==\n \\ ^ /\n )=*=(\n / \\\n | |\n /| | | |\\\n \\| | |_|/\\\n jgs //_// ___/\n \\_)\n "
> x <- say('time', type = "string")
> writeLines(x)
--------------
2018-03-13 13:25:19
--------------
\
\
\
|\___/|
==) ^Y^ (==
\ ^ /
)=*=(
/ \
| |
/| | | |\
\| | |_|/\
jgs //_// ___/
\_)
If you look at the help page for the say() function, you'll see that by default type = "message", which is why we couldn't store it as a variable using x <- say(). Changing to type = "string" means we can 
The top answer to this stack overflow question explains why we have to use writeLines() rather than print(). Note:
> print(x)
[1] "\n -------------- \n2018-03-13 13:25:19 \n --------------\n \\\n \\\n \\\n |\\___/|\n ==) ^Y^ (==\n \\ ^ /\n )=*=(\n / \\\n | |\n /| | | |\\\n \\| | |_|/\\\n jgs //_// ___/\n \\_)\n "