Hey folks, welcome back for another episode of Code Club. I'm really excited about this next series of videos that I want to work through with you all. So I am a microbial ecologist. I'm really interested in bioinformatics, which is why I make these videos. I know I have a lot of people out there that maybe don't care at all about bioinformatics or microbiology. Please, please, please stay with us through this series because I think you'll learn a lot, even though the application is bioinformatics. What I intend to do is to create an R package and hopefully host that on a website that will allow us to replace a much cherished and beloved website that went down in the last year. What is that website? Well, that's the ribosomal database project. They had a classifier that I know a lot of undergraduates and dare I say faculty at certain large universities might use to take a sequence and classify it using an algorithm that they published a long time ago called the naive Bayesian classifier, which was used to classify 16s rRNA gene sequences. Even though it has this kind of scary name of naive Bayesian classifier, trust me, it's not that complicated. But it's really powerful. And a lot of people over the years have tried to improve upon it and failed, which is kind of surprising because it's kind of a weird algorithm, as we'll get into over the course of the videos. The problem with this, however, is that I don't know anything about building packages. I've never built a package myself. There are people in my lab that are starting to make packages. And so I kind of feel this compulsion to learn how to make packages. Also, I've been using R and writing R long enough that kind of feel like I should have a couple packages, you know, in my list of contributions back to the R community. And so that's what I want to do with you all. But I need to learn how to do that. And so what I'm going to do is to teach you and as I teach you, hopefully I will learn. And so there is a great resource that Hadley Wickham and Jenny Brian made called R packages. And so you can get this from Amazon. I've got a link down below in the show notes where you can go and get your own copy. There's also a website that has the same version and maybe even a little more recent refreshed version of the book that you can get access to for free. And I'm going to basically use that as my tutorial to learn how to make a package in R. What I'm going to do in today's episode isn't start building this classifier, but I want to start by building a package. And if you look at chapter one of the R packages book, you'll see that there's a chapter called the whole game. And in there, they step you through creating a what you might think of as a toy package, a very simple package that allows us to see a lot of the functionality of the tools that are available to build packages in R. So building packages in R, I know at least is fraught with a lot of challenges. And I've seen numerous horror stories of people trying to submit a package to Cran and getting nasty grams back because they screwed something up. Well, Hadley Wickham and his crack band of developers have created a lot of great tooling around the generation and workflow of maintaining and producing packages. And so that's what we're going to use. And like I said, that first chapter of the book really encourage you to read that as well as the second chapter of the book. They're pretty short. And I'm going to go through that first chapter with you with kind of my own color commentary. I am here in our studio, you'll see that I'm using a relatively recent version of our our version 4.3.3 that came out at the end of February on Leap Day 2024. And what we'll go ahead and do is we're going to be using a package called DevTools. So I'll come over here to the packages tab. And I'll see if I've got it installed already. And I see that sure enough, I've got DevTools here. And it's kind of shortening the name a bit. But that's DevTools, right? And so if you don't have that installed, you would want to go into install. And then here do DevTools. And then click install. And that will install it for you. I think I do have the most recent version already, which looks like it'll be version 2.4.5. And to load DevTools into my active session, I'll go ahead and do library DevTools. So the toy package that we're going to create is called regexite. So regex is a regular expression that's kind of commonly used acronym for it. So regexite will be the name of this toy package. There's a lot of other regular expression tools already in R. There's stuff in base R. There's string i, there's string R. There's a few others. I use string R a lot from the tidyverse. And so we're actually going to be creating a function in our regexite package that's already in string R. And what that's going to do is it's going to take a string of characters that are separated by say a comma or period or something like that. And it will then return that string as a vector. And so you can imagine having a comma b comma c, the return would be a vector with the values a b c. Okay, so pretty straightforward. Yeah, the functionality is already baked into a lot of tools in R. But it'll be good for demonstration purposes. So to get going, I'm going to use dir dot create.  But I'm here already in R. So I'll use this. And so then I create the directory path that I want it to go to. And so it's going to be off my home directory desktop forward slash reg excite. This is going to work on a Mac or Unix computer, the alternative if you're using Windows, or you perhaps don't want to enter the command at the console is to use the finder that's built into our studio, you can go to files, then say desktop or wherever you want it to go. And then you can do create a new directory by clicking on that and doing that. And then you could type like reg excite. Okay, but of course, that already exists. So it's going to complain at me, we now have that directory created. And now we want to create the package. And so we'll do create underscore package. And we now give it the path, the same path that we used to the directory for our package. And so the name of the directory is going to be the name of the package. So it's really important that you name your directory what you want the package name to be. So again, Reg excite works. So we'll go ahead and put in the path, Reg excite. And this then does a whole bunch of stuff. And our studio and our have restarted. Basically, it's one of the things that does is it creates a R studio project. And you may know from your previous experience using our studio projects. So when you create a new project, our studio relaunches. And so we see that we have now launched into the working directory if of Reg excite, which again is off my desktop. You also know that if you look up here at the top left corner of my console, you'll see I'm in desktop Reg excite. And you'll see the contents of that directory. It leaves up the previous session of our studio. And you'll see here that this was the home directory was my working directory. So you'll see a change there. And you'll see that when we ran create package, it changed the active project directory, it created an R directory, it created a description file, which we'll see contains all this information. And then it tells us some of the other things that it did. I'm going to go ahead and close this R studio window and open up the other one. So again, we have these files and directories that are studio created, we can look at the description file, which has all sorts of great stuff in it, although it's pretty generic at this point, as we go through the rest of the episode, we'll we'll fill that out. There's a get ignore file. Yes, we will be using get and get hub to keep track of our project. And so this file tells get what things to ignore. Let's see, there's also a namespace file. So this document is read only, we should not be typing in this file at all. Again, it says generated by rocks gin to we'll talk about that later when we talk about documenting our code. And then what else do we have, we have this R directory, which is currently empty. That's where our R code will go. And there's also an R build ignore file. So ultimately, what happens is we build this package. And then we want to package all of the data and the code and documentation together to then submit to crayon for it to be available for everyone to use on crayon. We're not going to do the crayon submission today, but that's kind of the idea. And so the R build ignore tells that packaging process, which files to ignore, right? So it's going to ignore my our project file because that's not part of the package. That's a tool that I'm using for developing this package, right? Same with this R project user file. All right. And then there is this R project file. And this again stores all of the different settings that I'm going to use for my project. And I'm going to leave everything the way it is. Great. So I'll go ahead and close these files. And so the first thing that I want to do is go ahead and set up get that's one of the favorite things. I about starting a new project is get in it and starting a get repository for my project. And so they use this package that again comes with dev tools has a use get function that we can use to set up get in our project. So I'll go ahead and use get. And of course, it's complaining because it couldn't find the function use get because I forgot to load dev tools. So we'll do library dev tools.  And then it tells us what's uncommitted. It's kind of like get status.  And so what I really love about dev tools and these dialogues is that they give you generally two no options and one yes option. But they put them in different order every time. So you have to be mindful of what you're doing.  You really have to force you to think about it. So I'm going to go ahead and do one for yes. And so then adding files making a commit with message initial commit, a restart of our studio is required. Are you ready to restart now? Absolutely. Yeah. So number two here. So what I mean, they kind of change the order and the language. Again, this is going to restart our in our studio. Again, I'm back to a new version of our so I need to do library dev tools. So running this library dev tools every time I go into our might get a little bit tedious. And so one of the suggestions they actually make in chapter two is to use a dot our profile file. So dot our profile files are run as R is starting. And so what we could do is create this file and put a library dev tools as a line in that. Generally, we don't want to do that when we're doing kind of data analysis, because it's not immediately clear to the user what tools you have loaded. But if we're developing a package, then it's pretty clear that we're going to have dev tools installed anyway. So we'll be in good shape. I'll go ahead and create a new file. I'm going to make this as a text file. And I'll call it dot our profile. Click Okay. And then I'll put in here library dev tools. And I'll save that. So notice I did this as a text file rather than as an R script. The main difference is that as an R script, it's going to put dot R at the end of the file name. So we should be good there. And we now see that we have that dot our profile file. So next time we start our studio with our we shouldn't have to worry about running library dev tools again. So you'll recall that before that tangent of making the period our profile file, we used get to do an initial commit. And normally there's a tab up here, but I don't see it. So let me see. Yeah, so it's been hidden because because I've kind of got everything zoomed in so far. So I can go ahead and click on this clock. And this will show me the changes or the commits I've made. And so the very first commit was my initial commit. And so we'll see that there. Again, I have added dot our profile. So I'm going to go ahead and commit this by clicking the staged button. And then again, because I have things zoomed in, it looks a bit weird. But here in my message, I'll go ahead and say, automatically load dev tools at start of our session. And I can't see the left side of my screen here, which is really annoying. So I'm just going to have to trust that I've got it right. So I'll go ahead and commit that. And it looks like I spelled it right. So I'll go ahead and close. And now everything is good in my get window. Because I have that tab missing off the right side of the screen, I'm going to go ahead and modify the appearance of my window here. And so I can do that in the main settings, the global settings. And if I go to pain layout, I'm going to go ahead and let's see VCS is version control. So I'm going to I want to keep build and VCS I don't care about tutorial or connections or history. So I'm going to just work with those three tabs. And if I go ahead and do apply and okay, I now see that I've got those three tabs. So that'll make my life a lot a lot better. All right, let's write some R code. Yeah. So I'm going to go ahead and open a new R script. And again, what I want to do is create a function that will take a character string that's got some type of delimiter in it, and then we'll split the values in that string apart by the delimiter. And so I'm going to create a vector of values as a test. So I'll do alpha, beta, Charlie, and delta. And so I'm writing these without spaces. Again, the four Greek letters, the four call signs, whatever they are, with commas in between them, I can run that by having my cursor on the line and doing command enter. And if you do x, you'll see it. And so again, what I want as output would be a vector where alpha, beta, Charlie and delta are four separate values. So do that, I can do str split. This is a base r function with x being that character. And then I'm going to do a split on comma. And so the output then is more or less what I hoped it would be. One thing that you will notice though, is that instead of starting with the one like one alpha, beta, Charlie, delta, kind of like we had up here, we have the double square bracket notation with a one. And that's because the output of this is a list. I can use this as an argument to str to see the structure. And it says it's a list of one, right? And so there's a couple ways around this. One would be to do unlist on this. And so that will make it not a list. The problem with unlist, however, is that if I actually had two values in my x vector, so say I had this string alpha, beta, Charlie, delta, and then I had ABCD as a separate value. And then I did unlist, it would give me a vector that's eight things long, rather than four things long, right? And so it's going to unlist or it'll turn the list into a vector, right? And it'll concatenate all the vectors together. So that's not so great. An alternative that will actually do is to do square bracket, square bracket one. And this then will return the first value. So if there were two values in x, this would only return the first value. So this is my function. And I'm going to wrap this in a function str split one function. And it's going to take as arguments x and split. And then we'll go ahead and put this in curly braces. And I have other episodes where I've talked a fair bit about writing functions. So I'll save that for there. I can go ahead and replace this comma with the split. So now I've got my function written. Normally what I might do is say load this, I'll go ahead and do that. I'll go ahead and load this into my R session. So it's there now if I do str split one on x with split equals comma, then I get back those four values. I don't want to do it this way because I want to create a package. And so over here in the environment, you'll see that I've got my function loaded. I can go ahead and clean out my environment so that that's gone now, right? And of course, x is also gone. So I want to go ahead and reload x. And I can't rerun str split. So I want to create a R script that will have my str split one function in it. To do that, I'm going to use another use function called use underscore R. And I'm going to then call that str split one. This then creates a file called str split one. And that is living in my R directory, right? So now I'm going to go ahead and copy the function into str split one and save that. I'll go ahead and close out untitled one. Again, I don't have str split one loaded in my environment. So to get this into my console, what I will do is load all load all will load everything that's in my R directory into my R session. And so now I could do str split one on x with split equals comma. And it does exactly what I'd hoped it would do. Okay, so load all will be really helpful for us as we're creating R scripts, editing the R scripts and then want to load them into our working session so we can do work with those as we're going through our developmental process. So I'm going to go ahead and do another iteration of committing things. So I'll go ahead and click that stage button and commit it. And here I will say create str split one function and commit. And so that's been done. And we'll go ahead and close that out. And so get is up to date. Now what I'd like to do is check my progress and see how I'm doing at building my package. From the command line here, I can go ahead and do check as a function with no arguments. So it's asking me about installing the build tools. I'll go ahead and say yes. So I'll go ahead and run this package build command that it suggests. This is complaining again. It's kind of sending me through a loop. I don't know what's going on. I do have my Xcode tools installed. That shouldn't be a problem. I'm going to move on from here for now and worry about this later. The check function really makes sure that the package is all together in good shape. And for our next episode, I'll be sure that this problem doesn't persist for I'll do some digging to figure out what's going on. So let's go ahead and look at some of the documentation in this description file. And so this creates a template and we can modify some things. So I'll go ahead and modify the title. So I'll do exciting package for working with strings. And then for the authors, I can go ahead and put in my name. So I'll put Pat Schloss. And then for my email address, I'll do pdschloss at gmail.com. And I'll leave all that stuff. I do have an Orchid ID. But if you don't have an Orchid ID, you can go ahead and remove that. So I'm going to leave it for now because maybe I would come back and change this in the future. And then a description as a paragraph, what the package does. So string manipulation package that goes above and beyond what other packages do in an exciting way, right? Because we're so excited about rejected. Exciting way. All right. So we'll go ahead and save that. I'm going to hold off on modifying the license at this point. I'll go ahead and save my description. And then back in my console, I'm going to use a MIT license. So we'll do use underscore MIT license. Run that. We see that it creates a variety of other things that we see now under the license line in my description. It says license MIT plus file license. Over here in my file window, I have license, which is the license that will go into the package. And license MD is the license that is then readable on GitHub once we get that posted. And so this all looks good. I could imagine maybe modifying Regix site authors to be me, but there might be other authors that come along. And so the Regix site authors would include everybody that's contributing to the project. Okay, so I'll go ahead and close these. And I'll go ahead then and do a commit. And I'll say modify description and add license. Okay, so commit that. Now I'd like to add some documentation to my R function, right? You know that if you do like question mark, and then read underscore CSV, you'll get a help page for that. Or if you go over to the help tab, you'll find the help documentation there as well. So we want to go ahead and insert that for our code. So this is where Roxygen two comes in handy. Roxygen two is a really handy way to comment our code that are can then process to make the documentation. So we will leverage our studio here by going up to the code window, and then coming down to insert Roxygen skeleton. And there's of course a shortcut with keystroke that you can use to do that. This then inserts a template. And so in here, then I can put a title. And so this is going to be split a string. And then to the right of my two parameters, I can go ahead and put a description. So I'll say a character vector with one element. And then split will be what to split on. Great. And then for some examples, I can in here put some R code. So I can do x. And then here I'll do alpha, beta, Charlie, delta. Right. And then I can as an example do str split one on x and the split then would be the comma. And so that's my example. And now I can go ahead and save that. And then back in my console, I'll go ahead and do document. So this is complaining, saying return requires a value str split one line six. And so that the return here should be a character vector. Okay, go ahead and save that. And now we'll try document again, goes through without any errors, updates the regex, updates the regex site documentation. And so now if I do question mark str split one, I find over in my help page that I get a preview of what the help will look like, right? So that's pretty awesome, huh? Great. So that's where the help comes from if you've ever wondered, we will have to write the help and the documentation for each of our functions. So one other thing that I've noticed has changed by using get is the namespace. So if I go to files namespace, I see now it has in here, export str split one, again, I don't want to modify the namespace file by hand. And I notice that in str split one, for that function in the documentation above it has the keyword at export. And that then tells are to export this function so that other people can use it. That's great. So I'll go ahead and stage these changes. And I'll say add documentation for str split one and commit and close. So the book then says to do another check. I think this is going to give us the same error that it had before. Yeah, so I'm going to say I'll try it again. But it's complaining. So we'll just move on from that. And then the next thing to do would be install. So this will install my regix site package into my R session. So this installs it. And I bet if I come over to packages, and then search for regix site, it is loaded into my my session. And it actually looks like it's already been libraryed and it's already been attached. But normally would then do library, regix site. And that would then attach it so that I could of course use str split one, as we've already done, right, I could do str split one with x, and then with the comma to separate it, it's starting to look like a package, like we might use in a normal R session, albeit a very limited package at this point. As we continue to develop more and more functions and more complicated functions, we're likely going to want to be able to test our code. And so there's a package in all our called test that that allows you to automate the testing of your functions. And this is important because while we might all do tests of our functions, like I've done here, we don't typically automate them. And the value of automating them is that I might make a change on this side of the package and the code base. And I don't realize that it changes something on this side, right? So a change over here could cause something over here to break. And so by automating our tests and having a good set of tests, we then we make sure nothing is breaking when we make changes. And so we're going to go ahead and use test that so we'll do use test that. And that initializes things. One thing to notice over here in files is that I now have a tests directory. I noticed I also have a man directory, which has the documentation for that for the str split one. But in tests, there is a test that our script. So this is this file is part of the standard setup. Don't touch it. Okay. But what we're interested in is what's in test that. And so our scripts for testing will be stored in test that and if you're not familiar with the test that package, it has a lot of really powerful tools that really encourage you to go look at. We'll be using test that a lot as we go through the development of our own package. So to then create a test, I'm going to go ahead and do use underscore test with the name of the R script. So kind of like before I did use our str split one. Well, now we're going to use use test str split one. This then in our test that directory creates a file called test hyphen str split one dot r. What we'll find is that these files all start with test hyphen, and then the name of the R script that we're testing. Okay. It opens with some test test language. And so this is going to give us a sense of the general syntax for our testing that will have test that and then a string that is the title of the test comma and then curly braces and inside the curly braces will have some statement that's like expect underscore something right so this is going to expect equal two times two and four and so this should pass right so if I go ahead and save this and then go to build I can click on the test button and this will run through and says everything passes which is good alternatively I could do test open close parentheses and everything passes there as well so this isn't the test I want instead I'll do test that and I will then say str split one splits a string okay and then again between the closing quote and the parentheses I'm going to put in curly braces and do expect equal and then I'll do str split one and I'm the argument I'll give it is a comma b comma c and then the separator all the split equals the comma I don't really need that split equals but whatever and then what I expect to output would be a vector of a b and c so that should pass if I go ahead and test that sure enough that passes and we're good to go so anytime then I run test this test and all the other tests I write will get executed and if I if something fails it'll let me know so I'm going to go ahead and commit this change to add the test and commit and we'll say add test for str split one great I kind of I like to do a commit for any kind of meaningful change but I want the change to be cohesive we're kind of committing pretty frequently probably more frequently than I normally would but I wouldn't want to like I don't know have it test and a documentation for something totally different on the same commit I prefer have those commits handle different changes different sets of change right okay so speaking of change what I now would like to do is to change my code so that instead of being based on str split the base r version of this string I instead want to use the string r version which is str underscore split okay and so we're going to change the name of the function we're going to bring in functionality from other packages and so many or I'd say nearly all our packages are built on other our packages and so we need a mechanism to bring in what we want from those other packages into our own package so to get going on this we'll go ahead and use the use package function and I'll put in string r and so it's adding string r to the imports field in description and so if I look at my description under imports it is using string r I also notice I didn't see this before that it's added this information about test that when I added use test that and use test previously okay and so then it says if you're going to use a function from string r we need to write it this way so string r colon colon and then the name of the function so we'll need to be sure to do that and so now I'm going to refactor my code and so I will go ahead and make this str underscore split underscore one this format of the name is more in line with the string r way of doing it so as the book mentions this might be a preferred way I think it's a preferred way to name things but writing it this way makes it perhaps a little bit more clear that this is based on the string r package and so we'll also change the arguments to be string and then here pattern and then n equals inf and so this would be how many things we want to return and then to modify the code we'll go ahead and add some other type checking to make sure that the strings are properly formatted so we'll do stop if not is dot character on string so if it's not a string then we're going to bail out of here and complain and then we'll do length string less than equal to one what this says then is if our string variable isn't a character type and if it's longer than one then it's going to complain and so we want again because we're worried about getting this problem with lists that we described here we want to make sure that string only has one element to it cool the other thing we'll then do is if a length string is one then we're going to do good stuff right this is kind of the happy path and I will grab this code because that's going to go in there and let's get some white space in here and so again the string our package and then we want str underscore split and then the argument here is going to be string equals string and then pattern equals pattern and I notice I misspelled string here you should have said something remove that and then we'll do n equals n all right so if if the string isn't equal to one so in this case it would be zero right we'll then do an else and here then we'll return an empty character value so character empty so it'll be a character vector but it's going to be empty right so if we ran this in the console it would look like this okay great and so then it will return the last value that it computes in this function which hopefully will be the same thing that we had before so I'm going to go ahead and save this and we need to rename this file to reflect the new name that we have right and so to do that there is a handy dandy helper function in dev tools that we can use which will be rename files and we'll use the current name str split one and we'll change that to str underscore split underscore one and it's saying that this file that I have that's open has been deleted do I want to do that close the file now yes and so this file also doesn't exist so we'll also say close that now right and so our studio sometimes does this funky thing where it lists the file name twice in the files window I find that if I hit this refresh button it updates that and again if I come down to r I now see that str split one dot r has been updated and so we also need to update the parameters here and so and the help the examples rather right and so param will be string and split will be pattern but instead of pattern instead of kind of putting in n what we can do is we can have raw oxygen import the arguments from the function that we're basing things on right and so what we could do instead would be inherit param inherit params so then we'll put in stringer and str underscore replace and I don't want that space there and then I need to update my examples to be str underscore split underscore one with x and then pattern equals that and let's go ahead and add another example in here and I don't want the comment there so we'll go ahead and do a pattern x x pattern and then we'll do n equals two and we'll go ahead and save that and I think that's all good we also need to update our test and so we'll go down to tests test that and then this and so we'll go ahead and modify this to be str underscore split underscore one I guess I should update the test name as well and this should be then pattern and that should be good let me go ahead and run this to see that the test works again build test and it's complaining that the objects listed as exports but not present in the namespace str split one so what I need to do is load underscore all and so it gives us a warning message objects listed as exports but not present in namespace str split one so back in my namespace I see that it is still exporting str split one and so what I need to do is run document and so now I see in namespace it's exported that and I can then do load underscore all and that works okay so we're in good shape to add additional tests I'll go ahead and type them in and I will be right back all right so in the book they had a couple extra tests to go ahead and load checking that there would be errors right from that stop if not if the input length was longer than one and then making sure that string split one will expose features from the string our version of string split and so we see that with n equals two so if we give it a string with three elements in it it's going to break it into a vector of length two so you'll get a and then bc also if we do string split one we should be able to give it patterns and so this then is matching a period and so it's going to split a period b into a and b we've saved this we'll go ahead and test it so running that I see I had two failed tests and one passed not good and so I see in my first test uh that's online two here right um object pattern with one t not found and so I think that's actually over here um yep right here online 18 I have one t so I'll go ahead and save that and then load all again and then I'll redo my test and now everything passed cool so again that test is going to be really helpful for debugging our code as well as making sure that our code doesn't break other functions in our in our package so we've made this package and I would like to get it up onto github now and so we will use a function called use underscore github um so to use github you have to have a github account so I would encourage you to set that up um I'm going to put this on the riffamonus website riffamonus github account so you should be able to run use github open close parentheses without doing anything I'm going to go ahead and use organization equals riffamonus so you don't do that I'm doing that so you would you would drop that out and again have use github open close parentheses with no argument and so this is giving us a dialogue they're uncommitted changes and we're about to create a push create and push to a new github repository do you want to proceed anyway no so I'm going to go ahead and say no there and I'm going to come back to get and I've all these changes right um so we'll go ahead and do this and this was all from our refactoring to use string r instead of base r and so we'll go ahead and commit so use string r rather than base r to do splitting okay I'll go ahead and commit close that's great and so now I will rerun this command all right so it's saying creating the repository setting the remote origin to this address adding that URL creating issues there's one uncommitted file description okay to commit it I will say I agree so number two this was adding the github links to my description and then it pushes the main branch to github and sets origin main as the upstream branch and so now I come and I see that sure enough I have my github repository for this project so that's pretty exciting right so now everything is here and so as I make a series of commits you know maybe I get to the end of the day or I've made a big set of changes I can then push it up to github for other people to get access to which is pretty awesome one thing we'll see on here is that my readme file well I don't have a readme file so I need to add a readme file and we can write a readme file in our markdown so to do that we'll use the helper function use readme underscore rmd and we see that that creates a readme.rmd file adds it to our build ignore because we don't want that to go into the overall package and it's then creating a hook or an action that we will do when I commit if I commit readme.rmd without committing the markdown file or maybe it's the other way around whatever git is going to do something special so I don't have to worry about that which is great so this is some default text that it throws in here this isn't what I want to use so I'm going to go ahead and do a command a to highlight everything and delete it so on the book's website they have a link that I'll put up here for regexite readme.rmd I'm going to go ahead and copy all this code so we don't have to type 69 lines of code because that's not really what's important at this session so I'll go ahead and save that and now in my console I'll do build underscore readme and it will go ahead and render the readme.rmd file as a markdown file and I'll go ahead and commit my readme commit that close close and push when I come back to my version of the repository and refresh I now see that I have the readme file okay so again there's a lot of these great helper functions for building the packages and working with other workflows so we're using the use the readme and github and all these things the use github use readme use test that they work well within packages but you don't have to use them within packages you could also have used those with a normal you know data analysis script outside of a package but at least in our case it really helps to make the workflow of building out our package a lot smoother so at this point they recommend running check again I think we're going to again get the same problem that we had before anyway we could then go ahead and do install that the check is checking things it's not necessarily installing anything whereas install will go ahead and do kind of like we would with an install dot packages right and we now have that one thing I want to point out is that we have this package up on github it's not in crann but it's almost as good so crann has a whole bunch of other tests that they run to make sure everything's on the up and up if I had a package up on github or say I make some changes and it's not been updated to crann yet you could still install it even if you don't know me right even if you're not connected with my project and you can do that with install underscore github and then you could give rifomonas forward slash reg excite and this then will download my version of reg excite from github and then build it out right so there's a couple different ways to do it clearly we could download you could clone the repository and do install which is basically what we do when we're building it but you could also do install underscore github to install the package from the repository that's up on github so this has been a long video I'm sorry for that it's good for me though because I need to go through all this to start learning how to do it and eventually we'll be applying it to our own package and and doing that type of workflow one of the things to keep in mind is like this just seems like so much to remember right but there's a number of functions that we've used that we probably would really only need to use once right so that'd be like um create package use get use mit license use test that use github use readme rmd we run those once at the beginning of creating the package and then it's done in general I don't remember these things right I know that I can come back to this chapter in the book when I make my next package to do it again right and there's also been subtle hints along the way like when we made the description it tells you to you know use mit license to create the mit license right so that's that's pretty helpful and also a lot of these names um they have names that are really helpful like use github it's pretty easy that even I would probably remember that um there's also functions that we're going to use on a regular basis like use r use test use package again use r to create a r script for our tooling um use test we'll create a test based on that script and then use package if we want to bring in functionality from other packages like we did with a string r and then there's functions that we're going to use a lot more so like load all if I make changes to my r script load all will load those changes document if I change the documentation it will then load that documentation and update like the namespace and the the help files and things like that test to run my tests and then check I need to get checked to work um but check then we'll make sure that the package has everything that it needs to to be functional all right so hopefully as we go through developing our own package um we'll get you know pretty comfortable with using these different tools I'm sure we will because you know practice makes perfect at least for me I need to screw things up a few times as you've already seen in this episode before I really understand things and can move them forward many thanks to Hadley Wickham and Jenny Brian for creating these wonderful tools and creating this great resource of our packages really encourage you to get a hold of this or to go to their website uh where you can kind of read along and see a little bit where we're going to go I'm not going to be following this book uh super strictly as we go through I probably will be consulting back to it again as I'm trying to learn things and learn how we can use their tooling to make our development process a little bit easier so anyway I hope you check that out please also check out the paper that I've got down in the description that describes this naive Bayesian classifier and I'll talk to you next time for another episode of Code Club


Gentlemen, the President of the United States. I have an opening statement. Earlier today on his return from Geneva, Secretary Schultz reported to me on the full details of his discussions with Soviet Foreign Minister Gromyko over this past January 7th and 8th. As you're aware, his meeting with Mr. Gromyko has resulted in agreement between our two nations to begin new negotiations on nuclear and space arms. Our objective in these talks will be the reduction of nuclear arms and the strengthening of strategic stability. Our ultimate goal, of course, is the complete elimination of nuclear weapons. I want to take this opportunity to congratulate George Schultz, Bud MacFarlane, and the rest of our delegation for a job well done. Their teamwork in Geneva was American diplomacy at its best. Our differences with the Soviets are many and profound, and these new negotiations will be difficult as we grapple with the issue so central to peace and security for ourselves, our allies, and the world. But we will persevere. And while we must continue to resist actions with the Soviet Union that threaten our freedom and vital interests of those of other nations, we must also be prepared to work together, wherever possible, to strengthen the peace. When I spoke before the United Nations General Assembly this past September, I set out my objectives and proposals for a more stable and constructive relationship between East and West. Today it's my hope that this week's meeting in Geneva, while only a single step, is the beginning of a new dialogue between the United States and the Soviet Union. It's also my hope that as 1985 unfolds, this year will emerge as one of dialogue and negotiations, a year that leads to better relations between the United States and the Soviet Union. I believe a more stable peace is achievable through these negotiations, and I urge all Americans to join us in supporting this search for a more stable peace. But it takes two sides to have constructive negotiations. One side alone cannot do it. We've made clear our intentions and expectations for progress in U.S.-Soviet relations. Secretary Shultz has reinforced that message in his lengthy sessions with Mr. Gromyko. For our part, we'll be flexible, patient, and determined. And we now look to the Soviet Union to help give new life and positive results to that process of dialogue. Now, Ellen? President, if you are flexible, are you willing to trade off research and Star Wars technology for deep cuts in the Soviet nuclear arsenal, or are you set in concrete, as your advisers say, against any negotiations on Star Wars? Well, let me say, what has been called Star Wars, and, Ellen, I wish whoever coined that expression would take it back again, because it gives a false impression of what it is we're talking about. But that will be on the table with everything else, of course. There are no preconditions with regard to the talks that we're going to have. But this is research, a research program, and it is within the provisions of the ABM Treaty. So all that we've made clear is that we're going forward on the research. But we've also made it clear that if that research does come up as we hope with something that could be the defensive weapon we're talking about, non-nuclear, then we would be willing to go into negotiations and discussions with the other nations of the world and with our allies about what to do about that and whether and how to deploy. Star Wars, even if you don't like the term, it's quite popular, is on the table for negotiations at some point where the technology might be developed? It's on the table only because we made it very clear. I mean, it's not just a bargaining chip. No, oh no. That would not be bargaining. No, no. Now, whoops. Mr. President, in the past you have characterized the Soviet Union as an evil empire. And you have said that they have repeatedly violated the arms agreements that they have made with the United States. Some of your advisors today doubt that the technology exists to adequately verify any agreement. Do you believe verification is possible or do you think the Soviets will try to violate any agreement you might make? Well, we know that they have had a past record of violating agreements. We know also that absolute verification is impossible. But verification, to the extent possible, is going to be a very necessary feature in our negotiations. And I would like to also point out that because they themselves have expressed the desire to totally eliminate nuclear weapons, zero nuclear weapons is far easier to verify than if you're simply reducing the numbers to have to continue trying to count numbers is much more difficult. Gary? Mr. President, thank you. Senate Republicans and the leadership and one of your top advisors both have said social security costs of living allowances are not necessarily untouchable in the effort to reduce the budget deficit. Is the social security cola off limits, as you promised during the campaign, or is it negotiated? Well, Gary, I never specifically mentioned that. I did say, however, that I would resist anything that would reduce the payments and the benefits which it had been intimated in the campaign, you will remember I was responding to charges that I had some secret plot and plan to do that. I had no such plan and I am resisting of this. I think what someone has taken is a comment in one of our own meetings about the present budget based on some news reports that up on the hill there was widespread feeling about freezing the colas and social security. And all I commented on would be was that we might be faced with an overwhelming bipartisan majority in both houses in support of that. Well, I don't talk about what I would or would not veto until something reaches my desk, but I think I would have to look at that situation and what I was faced with with regard to a possible congressional mandate. On the other hand, I have to say this about social security and the colas. And I think that some of those who are calling for that on the hill should recognize social security is running a surplus. Social security is not a part of the deficit problem. It is totally financed by a payroll tax. And that tax is totally dedicated to that one program. If social security's spending were reduced, you could not take that money saved and use it to fund some other program in the deficit. It would simply go back into the Social Security Trust Fund. So I think that it's far more profitable the idea of balancing the budget to turn to the programs that are really causing the deficit. Sam? Mr. President, a man in a subway in New York City took a gun and shot four youths who apparently were trying to shake him down without reference to that specific case since it is in the courts. What do you think about the use of deadly force in trying to defend oneself against attack? Sam, I'm glad that you said that about it being a case now before the courts because that does prohibit me from commenting on that particular case. In general, I think we all can understand the frustration of people who are constantly threatened by crime and feel that law and order is not particularly protecting them. On the other hand, I think we all realize there is a breakdown of civilization if people start taking the law in their own hands. So while we may feel understanding or sympathy for someone who was tested beyond his ability to control himself, at the same time we have to abide by the law and stand for law and order. Mr. President, many Americans feel that there is no law and order, that the police either are unable or not sufficiently enforced to do their job. What then is the alternative for Americans? There apparently are some centers of crime and places where criminals have found happy hunting more than others. But actually, we've been making sizable progress in the last few years with regard to law enforcement. For the first time, I think, since the crime statistics have been kept, in the last two years they have gone down, two years in a row, in regard to serious crime. So a lot of it, I think, depends on all of us and our insisting on law and order. I don't blame the police so much for what we've seen over the years as a kind of an attitude in the whole structure of judicial and everyplace else in crime, in which it seemed that we got overzealous in protecting the criminals' rights and forgot about the victim. And I think if we have stricter enforcement and stricter punishment, we'll continue to see decline in crime. Bill? Mr. President, have you painted yourself into a corner with your campaign promises to raise taxes only over your dead body, not the cut social security, and to keep up defense spending? The majority leader in your own party in the Senate is talking about writing his own budget, and it appears to many people that you have walked away from the deficit problem and the budget problem and are going to leave it to Congress. No, in the first few days of February, we will be submitting our budget to the Congress. And I don't mind if they want to do what they're doing and have some plans of their own or suggesting some. Maybe they've got some ideas we haven't thought of, and I'd be very happy to look at theirs as well as ours. But it is my responsibility to submit a budget. I'm going to submit it. And our target is to have a budget that in overall spending will be no greater in 86 than the spending in 85. Mr. President, it's not just even within your own party, it seems to be that if you keep all your promises, there's no way that you can accomplish that goal. I just don't believe it. First of all, I think that the risk of a tax increase, of slowing down the economy and putting us right back in a pattern that we've had since World War II, eight recessions in a row. And every recession led to the next one being worse and inflation higher and unemployment greater and so forth. We have made a great start on a recovery that is based on sound principles and not on artificially stimulating the economy. We're going to stay with a plan of that kind. I think that a tax increase would be counterproductive. And I think also that today, even though you all had to report that there was a fraction of a percent of increase in the unemployment rate for December over November, I'd like to point out that and I, the statisticians always do puzzle me. However, there were 340,000 more people employed in the United States in December than were employed in November. But evidently, there were more new entrants to the job market. But we have more people employed today. But just as one figured, the only reason I brought that up is to point out, there are 340,000 more people in December, unanticipated, I'm sure, by many, who are now taxpayers and who will be contributing to government's revenues. And the best way to increase government's revenues is not by increasing the rates. The best way is by keeping the rates down but increasing the economic upsurge. Mr. President, you said after your reelection, you did not want to break up a winning team. Yet your three top assistants are leaving the White House and Mr. Dever and Mr. Clark are leaving the administration entirely.  And aren't you going to feel a little lonely without your long-time California aides? Well, of course, I'll miss anyone of those. We've been a fine team and any of that feel they have to leave. But it was no great surprise to me. I said from the beginning that I wanted people to take these positions in government, but I was not setting any time limit as to how long they had to stay. I know that some people can only stay a short time and then they have to return to their own private lives and careers. And I said that I would then go out and find someone to replace them when that time came. So Secretary Clark, I'd like to point out that Secretary Clark, at my behest, was in public life longer than I was because between being Governor of California and being President, I had a few years as a civilian. He didn't. Due to me, he was on the California State Supreme Court. He's given 18 years to public life away from his private life and he told me a couple of years ago and he stayed on when I urged him at that particular time to do so for a while. But I've understood that he was coming to the point that he wanted to and wouldn't return. Mike Dever, I knew that if there was a second term that he didn't feel that he could go for eight years, he'll be very much missed. But some of the other people you mentioned, they're just changing chairs at the cabinet table. They'll still be around. And I don't care which side of the table they're talking from, I'll be listening. Chris? Yes, sir. I'm a little confused by your original answer on, if you will forgive me, Star Wars, if we can continue to use that term. You say that you're willing to negotiate about it now, but you also say that you want to go forward with research and only really discuss limits after it proves out whether the plan is feasible or not, which is sometime perhaps beyond your term into 1990 or so. The question is now in the talks that are going to begin this year, would you consider setting limits on the deployment and the testing of Star Wars? Chris, I think that would be way ahead of ourselves. We don't even know what kind of a weapon if we're able to come up with one that this would be. Now, I think maybe some of you've been looking at some of those drawings on your TV news programs at night in which you've already got a picture of the weapon and I can see it shooting missiles down and it looks so easy. We don't know. That's why when I said Star Wars and criticized it, I never mentioned space or anything. I don't know. I'm not a scientist. I said all through history, we've always been able to come up with a defensive weapon. Isn't it worth researching to see if there isn't some weapon that is more humane and moral than saying that the only defense we have in the nuclear age is that if they kill tens of millions of our people, we'll kill tens of millions of theirs. We're searching for a weapon that might destroy nuclear weapons, not be nuclear itself. Destroy weapons, not people. And if we come up with such a thing, then is it time to turn to the world, to our allies, possibly even our adversaries, and say, look, we now have this. And if we haven't by that time eliminated nuclear weapons entirely, this could be a big contributing factor to bringing that about. But aren't you running the risk of letting these arms talks break down over this issue? The Soviets say that that's their top priority. No, no, we're one of the three phases that has been agreed upon in what I think is a most successful meeting in Geneva is that we will be talking in three groups about strategic nuclear weapons. These are offensive weapons, about strategic intermediate range weapons, again offensive. And there will be a third sector where we will be talking about defense and space, whether it has to do with weapons shooting things down that are in space, or whether it's weapons in space shooting down. And as I say, what we're doing with this research and the Soviets had no argument about that, they couldn't argue about it, is to research, continue researching, is within the provisions of the ABM Treaty. Yes. Mr. President, in response to Gary's question, you indicated that you might accept a freeze in Social Security colas if it were forced on you by Congress. Would you also accept cuts in military spending and a tax increase if Congress pressed you on that? No, I feel that a tax increase, as I say, would be counterproductive and would set us back in the very thing that we have accomplished in these first four years and intend to carry on, that is, an economic expansion. With regard to defense, here again I have to say, defense is not a program in which we can determine what we want to spend. That is dictated by outside influences, things outside our country. And I would like to point out that the Defense Department has come in on its own voluntarily with a bigger cut than had been asked of it for the first year, for 1986. Now, they point out, and I think I support them in this very logically, that it is impossible to make a projection over three or five years as to what you will spend in those out years. What if some development on the other side of the ocean absolutely makes it necessary for us to do something that we can't even contemplate now with regard to national security. So all defense has asked is to not pin them down to the out years, but to accept that here in good faith they have come up with, as I say, a bigger increase than was asked. And may I call your attention to something else, and maybe you'd like to rally around and help with a few editorials? I think this policy sometime ago of the Congress demanding that the president submit a budget and then, based on that budget, submit projections for what the government budgets are going to be for the next five years. There isn't any economist in the world who can do that and accurately tell you what you're going to need down the road. And I'd like to point out that all of the projections that we inherited went out the window, they didn't match what we're doing now. And I think it is enough, I know that most of the states get along just fine with constitutional provisions that they can't have deficits and with the governors having to present a budget for that year. And a budget then when the next year comes around and those projections, frankly, I pay no attention to them. Putting forth a budget that doesn't even meet your own goals for deficit reduction, aren't you really begging Congress to do these things? No, we're going to reach our goal. We're going to submit a budget that sets us on that declining path. And as I say, our aim is a budget that is based on, that will be no more than the money spent in 1985. And that's our target and we intend to meet that target. There are a couple of things we can't control. And for example, the interest on the debt. So we have to make allowances in other areas and find cuts that we can make there. It would be very simple if the budget was of such a nature that you could simply say everybody's sense spend the same amount of money next year. We can't. Some are going to spend more, some are going to spend less and some we're just going to wipe out entirely. President, given the progress that you indicated made with the Soviets in these recent talks, do you feel that this might be the time now to have a summit with the Soviet leaders, Trenenko? Well, to have a meeting, as I said before, just to have a meeting doesn't make any sense. Now in this next month or so, we're all supposed to get together and find out when the negotiations can start and where. If at any time a reason arises in which a summit could be helpful in that or in other matters and carefully planned agenda created, which they themselves have said is necessary, I'm perfectly willing and have been all this time to go to a summit meeting. I don't think it would make much sense simply to say, well, now that we're going to talk about these other things, let's have a meeting just to get acquainted. That builds up people's hopes and some previous presidents have done that and found that the letdown was very terrible. Jerry? The summit was broached at all by Secretary Schultz to Foreign Minister Gromyko. The summit? It wasn't brought up in these. No, they had a very carefully planned agenda and incidentally there was no in-fighting among our group and 15 people that went over there as the total delegation were in complete unanimity in their support of what we arrived at and they were all of them experts in their fields and there has been no in-fighting as some have suggested about what we were going to talk about there and it was very careful planning and my last meeting with George and Bud McFarland was just few hours before they got on the plane to go over there but we had agreed upon what our agenda was going to be and what our demands were. Jerry? Mr. President, the time is drawing near when you will have to certify to Congress whether there's a need to continue supplying aid to the rebel forces inside Nicaragua and I'd like to ask if you intend to press on with this program when that date comes or do you see any reason or any developments that have occurred that would permit the United States to drop this covert aid program? Well, here as you know, I shouldn't be talking about anything that is supposed to be covert but I will say this that our plans that we have no plans for abandoning the overall ideas of help such as were created by the Kissinger Commission down there program proposed for over about the next five years to help those nations that are trying to become democracies, to be democracies and to support the people of Nicaragua who I have to point out are governed by a group that took over by force ousted others that had been fighting for a revolution and I think that they are supporting the guerrillas that are trying to overthrow the duly elected government of El Salvador and no, we're not retreating from what we feel are obligations there in Central America at all. Thank you, Mr. President. By the end of the year, if the United States continues to deploy its strategic submarines as planned, it will exceed the limits for strategic missiles under the salt to agreement, Mr. President. What is your intention with respect to that agreement? Are you going to decrease the number of ICBMs and outmoded submarine missiles in order to keep that salt to agreement alive even though it's not ratified? Well, we have been holding to that and thought that it would be helpful in now what we're planning going forward with. We have been eliminating some of the older missiles and taking on service some of the submarines. We will continue on that ground. The development of the Trident is not so much in the sense of adding to the nuclear force as it is in modernizing it, replacing older, less accurate missiles and submarines with not quite the capacity of the Trident. So, yes, we feel that we can live within it. Remember, the salt to is nothing but a limitation on how fast you increase weapons, which is one of the reasons why I was in support of a Senate even though I wasn't here at the time that refused to ratify it. And that's why my belief is that the type of negotiations we're suggesting are the only ones that make sense. Don't just limit the rate of increase, reduce the number of weapons. President, your aides have said that they have some innovative, interesting ideas if the negotiations are resumed. What are your ideas, defensive weapons aside? What are your ideas for reducing offensive systems? Ideas that were not put forward in the negotiations that were aborted and that could offer some hope for progress in this new round of negotiations. I don't want to give away anything in advance that things that belong at the negotiating table. But yes, one of the things that we've made clear to the Soviets is that we recognize there may be differences with regard to the mix of weapons on both sides. And we're prepared to deal with that problem and where perhaps we have something that is an advantage to us. They have something that's an advantage to them to discuss trade-offs in that area. It is true that when we first went into the strategic missile negotiations, we believed that the top priority should be land-based missiles. And the Soviets made it plain that they didn't, they weren't following our pattern of mix of missiles, that they placed more reliance than we did in the land-based. And they didn't wait for us when we told them that we were willing to, okay, to deal with them on that problem, they went home anyway and didn't come back. But these are new negotiations, both sides rule that they're new negotiations. No, no, no, I'm sorry, I want to, yeah, no, right there. Wake up.  I thought you had your hand up early. President, I know you're right here. Oh, there you go. Yep, literally. Right here, Mr. President. You started the week with a number of surprises and changes from your staff. I'm wondering now that you have the opportunity, if you wouldn't like to get any other personnel changes off your chest, such as the change in the replacement for Mr. Clark. Is it true, for example, Mr. Hodel's going to replace him? I ain't talking. I'll tell you when we've made a decision. No, then there's a young lady over here who I understand is new among us. Thank you, Mr. President. Do you think that the Geneva meetings this week and the resumption of arms negotiations in the near future might lead to the new era of detente that Mr. Chenenko called for last November? I think that there will be other things talked about other than just weapons. And yes, but let me make plain about detente. That's a word that been a little abused in the past in some ways. Yes, we would welcome such a thing as long as it was a two-way street. Our problem in the past has been that it has too much been a one-way street and we were going the wrong way on that street. So we very definitely are trying to arrive at a position in which we can settle some of the other bilateral and regional issues that trade matters that are at odds between us. What about other matters like Afghanistan, Southeast Asia problems there? Would they come up as well? They did not. Well, I can't say whether we voiced our opinion of those in these meetings. They very well could have in the long hours of those meetings, but all of those things, and we've made it very clear to them what our opinion is of some of those practices. President, are you about to name former President Richard Nixon to a post in your administration perhaps as a roving ambassador of some sort or perhaps somehow involved in the upcoming arms negotiations? Well, he has never suggested himself that he had any interest in such a thing and no, we have no such plans. Jerry, did you? Have you been consulting with him on the arms talks or do you plan to? I have, I feel that, and we do keep all the former presidents briefed and bring them up to date on things that we've done so forth, so I talk to him every once in a while like the day to say happy birthday, Jerry. Thank you, Mr. President. In light of the changes in jobs between Mr. Regan and Mr. Baker, do you now plan to make a greater push on simplifying the tax system and do you think it has a better chance of getting congressional approval? Oh, Jerry, whether that will help or not, all of us and the two that are changing jobs and myself, as well as others, are totally dedicated to trying for the tax simplification. Now, I know that some have suggested that maybe we're putting that on a back burner. No, we have been so busy and we put top priority on getting the budget ready. And with regard to that tax study made with the Treasury Department, they now are also getting input from various sectors of the business world out there in society. And also dealing with people on the hill, I believe that they recognize that there are things in there that may be options to choose or not to accept. And as soon as we get the budget in shape and presented, then we will go into the same lengthy process we've been in in the budget, only this time in the tax simplification because we're determined that we're going forward on these two tracks, but it is a two-track approach. We're not sending them up there as a package that somehow people can begin trading between one and the other. Helen, thank you, I'm sorry. Why don't you all get together and find some way in which I don't have to leave so many hands in the air? Hey! So is it? Security wouldn't allow me. Who's going to be there next month? Who's going to be there next month? Probably. Probably? Probably.


How's it going everybody? Dato Doi here with a very special Dragon Ball Fighterz video for you all today, as today we're going to be taking a look at the matches between myself and Globku, who is also behind the channel TGNAnime. The channel produces tons of quality content and even some Dragon Ball Fighterz stuff, so if that sounds interesting to you, I would definitely recommend for you to check the channel out. The links to do so can be found in the description as always. Before we go ahead and get into the match analysis, let's go ahead and talk a little bit about why I decided to do this video like this, so for those of you that don't know, me and Globku live very, very far away from each other, so we were both going into this expecting the connection to be a little laggy at best and a complete lagfest at complete worst. Luckily for us, the end frame delay was around five to six frames, so it wasn't the worst, but there were situations where it jumped up to pretty high numbers, and even one case where we had to call off a match entirely and just like reset the game. Because of this, I knew there would be a lot of situations in which if I had to restart anything I would have to restart the entire recording, and because Globku went out of his way to set this up with me and he made this like a live stream event over on his channel, I don't know if he's ever going to actually upload it for the general public or not. I just didn't want to waste his time or his streams time, so I'll be honest, there was just general nerves on my end. I just decided it'd be best to go with something a little safer and a little less out of the moment, you know, I could just go back and watch the replays later, if anything. So yes, I am very sorry that we're not going to get to see it live with my commentary, but hopefully you can understand my reasons why I chose to do it that way, and yeah, we still have some interesting match footage to look over, because these were some insanely fun matches. So game one of our best to five set opens like a lot of other game ones, you know, we're both playing very defensively, you know, it doesn't help that we're getting used to the frame lag, seeing how it would respond to our connections. In game one of any set like this, you're really just going to be looking for conditioning, you're going to want to see what your opponent does in response to your block strings or any sort of gimmicks that you have. You want to really be looking out for what they know and how they react to stuff. A good example of this is when I have him down in the corner with my Krillin, you're going to see me back up and fire the key blast up into the air, and really what he does here dictates what I'm going to do for the rest of the match. You'll see he opts to Superdash here and I just block, but for the next time this situation comes up, I am going to keep it in the back of my head that in this situation he wants to Superdash, or at least that's his first inclination. Regardless though, that's not going to matter too much for right now, as I am able to open him up with another hit and get into a situation where I can kill by spending one bar for the Destructo disc. This is good for me because it keeps Krillin my point character not going to be using him for his assist out in front, which is where I want him to be. Right here we see another strength with my team, I'm able to confirm off of a random Superdash with Yamcha's assist, which just means I get some more damage out of it and a sliding knockdown, and you can see here that I misread the situation, show my hand a little early, do the same Krillin keyblasting, but this time he opts to block, so good play from Globku not playing into my hand so early on into the game. In the moment this does put me into the state of mind where I'm like, oh maybe he knows what I'm going for here, maybe he's seen it before, maybe it's going to be a little hard to do that, it has me thinking of different options I should go for and losing a bit of confidence in myself and that gimmick. Another area of the game that we should definitely cover here is what Globku likes to go for after a vanish, so you'll see me do a back dash here because it's just one of my favorite options to go for, because if they press any buttons you can usually get him with a sweep, you see me attempt that here, but a lot of times after vanish what I notice in the set is Globku goes for an air dash in, which covers this option very well in case I go for a sweep like I do here, so really beautiful play here, he gets the hit on me and once again this is going to get me starting down to myself like oh man after vanish I'm in some trouble already. Everything that follows after this hit is both very important in the outcome of this first match and the outcome of the set as a whole, so what you're going to see is Globku spend a bar to get Goku out and Krillin in, and then he's going to go for the EX spin which I just have no idea how to deal with, so Krillin gets caught up in that very easily, and then you're going to see Globku go for a very popular mix up and one that I felt for a lot throughout the set and you're going to see countless times from here on out I assure you, as he goes into the dynamic punch and then lands and goes for a low right away, this was tripping me up a lot throughout the set, obviously it's one of those things where you watch it back and like man I wish I would have blocked those, but yeah this game it was really tripping me up so Krillin's going to go ahead and lose his life unfortunately to this low in a very well deserved knockout. A little later on in the set I get a sliding knockdown with my Goku and air dash him for some pressure I miss, so I just decided to go for a dragon rush because one he'd be expecting a hit and two it's super cheap in online environments especially like this, and then I try to follow up with a super but unfortunately miss the timing, I try to catch him with a classic Datodoya Yamcha super reset but brave Tien just comes flying in dodging all the hits. The next clip we have is definitely something I'd consider a scramble situation, I get hit by the beam on purpose because I don't want to take that go tanks assist, I call my assist out because I'm scared of any punishing from the super dash and then I just go straight into a medium wolf fang fist and EX it right away just to pick up the knockout on Tien and bring it down to just go tanks versus Yamcha and Super Saiyan Goku, but of course it wouldn't be a Datodoya special if I didn't lose my best assistant character Yamcha before being able to take full advantage of the 2v1 matchup, at this point in the game we're both down to one character piece and both still have our sparkings available to us, but I am able to get him to pop his sparking a bit earlier than me thanks to a vanish combo which puts him into a sliding knockdown and then I'm even able to get another vanish combo but for some reason don't opt to go for the sliding knockdown and instead opt to use my sparking, definitely a huge blow right here, I probably thought I could kill but I have to be honest I have no idea where I got this confidence from, that sparking definitely would have been better used defensively especially if all I'm going to do with it offensively is drop the combo right afterwards, but I guess that's why they call it the Datodoya special.  At this moment though I was panicking because this is go tanks on a hard knockdown, the mixups are going to be super real and I'll be honest at this point I'm thinking I have one combo left to live, so any one touch could spell certain death for me after this point. So it all came down to the okie, what was he going to hit me with? I vividly remember at the time thinking he's going to empty jump in low, but for some reason, for some reason I held back on my stick instead of down back and yeah I got hit, he carried me up and managed to knock me out with the ghost kamikaze attack, he had completed his go tanks comeback, I was impressed, I was like this go tanks is real dude, I gotta be super careful about him, but there was also a lot of errors on my part both defensively and offensively so I was thinking in my head if I clean those up and be sure to be extra careful of go tanks then I should still be able to come back in the next game with a fresh start in my mind. In game 2 there's really not too much that I really want to draw a lot of attention to, for reasons we'll get into a little later, but there is stuff in here like me using a lot more delayed get up in order for me to catch certain areas of his strings off, and just mash lights when I get up so that it's my turn on offense instead of his like it should be, I do that a lot throughout this match and I think it's definitely something that helped me overall. In the mid to late game of game 2 I'm able to get his Vegeta with a combo in the corner with Yamcha and you'll see here even though I'm able to kill with one bar I do switch out to Krillin because one Yamcha has a little bit of blue life that I wouldn't mind recovering and two Yamcha is definitely better in the back than Krillin is, you know Krillin's assist really isn't bringing too much Krillin's here for his you know above average beam game out in front and his you know mix ups of course, but yeah Krillin's definitely not here to be in the back, but anyway as we're winding down game 2 and coming to a close his go tanks alone has put a lot of damage onto my team and unfortunately this is where the game hit a 19 frame constant lag. It was really unfortunate obviously because we had already come so close to ending the game you'll see we both drop a lot of stuff and overall it's just really unfortunate I do end up winning this match but with a gigantic asterisk covering the W because you know 19 frames nobody's really walking away from this like oh wow what a what a skillful win that was but yeah I do get the win and we do count it for whatever reason but yeah we reset after this and luckily this was never a problem again, but hugely unfortunate that even one game had to be decided like this. Game 3 sees us reincorporate some things from game 1 mostly the super dash Yamcha strategy making it super easy to convert into some damage and a sliding knockdown in the corner. We also get to see some more standalone Yamcha come into play as he gets a nice combo on Vegeta in the corner and sets us up for what I thought was going to be a 2 bar knockout with spirit ball and destructo disc but he actually lives I think very quickly I dashed in and just clicked medium and we actually do get the knockout which is super important for us he could have fueled up a lot of health there and had Vegeta in the back always constantly being a threat but we managed to get him out rather early. We also see something later in game 3 that I really shouldn't have gone for as much as I did it's a form of Krillin Oki where after you get a knockdown you throw out some ki blasts wait a little while and then click down and it basically covers every option they can go for super dash you'll be able to punish it uh if they just wake up they have to block it uh yeah pretty much they either have to block it or risk getting punished by you and whatever option they go for uh I never practiced this I just saw it online and thought yeah that looks cool and for some reason decided to try it out here uh it never worked it always failed for me so I'm not gonna bring it up again but yeah here you can see me with it entirely uh mistime it and eat a punish for it so that's about how things should go when you just throw out things you see online and funny enough game 3 is also where I stepped up my defense a little bit you can see me uh blocking the go tanks mix up here obviously Glabku is very quick to realize that I'm starting to catch on to it uh so he's able to mix in a dragon rush here absolutely beautiful from him he knows that I've caught on at least a little so he's going to start actually making it a mix up and uh yeah very good decision it catches me here and uh now I'm into a bad way a little later in the game you'll notice the crown jewel of Datodoya resets I hit him with a sliding knockdown go into a Goku Super Saiyan level one notice the level three won't kill so I intentionally whiff a three bar super I get him to deflect it and boom hit him with a dragon rush simple as that Datodoya school of practice all it takes is a little bit of whiffing and uh you're in there obviously a joke I whiffed that on accident completely just luck that I was able to get a dragon rush off of it and secure the kill at the very end of game three we can kind of see the conclusion between me and the go tanks mix up you can see here that as he goes for it as the final character I just say you know what man I'm covering all the options I just opt to spark it uh really at this point I was like you know what he's gonna catch me with that every time uh so I'm just gonna have to use my once a game sparking on it which you will see me do again in game four it was just you know he really had me with this go tanks mix up so you know in the moment you have to kind of make these decisions where you see yourself playing poorly and you have to kind of use your sparking activation to cover that up heading into game four you can see I have him in the corner here and do the standard Krillin stuff that I've been doing all along and this time I choose to rush in because he has been blocking these past attempts and actually he drops his guard gets hit and I'm actually able to convert off of this which is actually very rare so I actually was pretty happy with that conversion that was definitely something that helped me uh go ahead and get the ball rolling with this game a little later on I'm actually able to get his Vegeta into a situation where I can kill with three bars with a Goku super from the air a spirit ball and then a very long-range destructive disc I always love when Yamcha's uh final hit of the spirit ball goes down and combos into destructive disc it just looks super cool and I'm very happy I was able to pick up a knockout with it and finally in game four you can see once again down to go tanks and Goku he goes for the same go tanks miss up and once again I'm just like nah I'm just I have to spark it at this rate so I do and eventually get him into the corner where I kill him with an overhead and that ends the best of five I take it three to one over globcoo was a lot of fun and uh really sad that I couldn't get a like live action ranked video for this but overall I do feel like this video turned out pretty all right go ahead and let me know what you thought of the video down below and make sure to check out tgn anime and all of their amazing videos that they do over there and I'll be down in the comments as always in case you want to ask me any questions about what I talked about in this video today while you're down there though if you like these videos and want to see more like them from the channel make sure to hit the like button and subscribe so that you're up to date on all of the videos I release on this channel I really do appreciate all the support anyway I'm dato doya and I'll see you in the next video