Resources

We want GREAT tables! | Richard Iannone & Michael Chow | Data Science Hangout

To join future data science hangouts, add it to your calendar here: https://pos.it/dsh - All are welcome! We'd love to see you! We were recently joined by Rich Iannone and Michael Chow, software engineers at Posit, to chat about their experiences building GT and Great Tables, how they drive community engagement around their packages, and their career advice for package developers. GT and Great Tables are R and Python packages for creating static tables in R and Python. They were created to fill a need for a good, maintained solution for generating tables with different output types from data frames. They've gained loads of popularity, and have an active community of users! Resources mentioned in the video and zoom chat: Great Tables Blog → https://posit-dev.github.io/great-tables/blog/ 2024 Table Contest Winners → https://posit.co/blog/2024-table-contest-winners/ Contributing to Public Transit Data Analysis and Tooling → https://posit-dev.github.io/great-tables/blog/open-transit-tools/ Tables as Powerful Representational Tools → https://www.researchgate.net/publication/363345970_Tables_as_Powerful_Representational_Tools The MockUp - 10+ Guidelines for Better Tables in R → https://themockup.blog/posts/2021-01-13-10-guidelines-for-better-tables-in-r/ Show Me the Numbers by Stephen Few → https://analyticspress.com/smtn.php Excel spreadsheets to gt package called {forgts} → https://github.com/luisDVA/forgts What They Forgot to Teach You About R → https://rstats.wtf/ David Robinson Talk called "The unreasonable effectiveness of public work" → https://www.youtube.com/watch?v=th79W4rv67g Publication quality tables in 2024 → https://posit.co/blog/what-we-did-with-publication-quality-tables-in-2024/ Great Tables Design Philosophy → https://posit-dev.github.io/great-tables/blog/design-philosophy/ gtsummary-to-excel → https://www.pipinghotdata.com/posts/2024-07-26-gtsummary-to-excel/ happy git with R → https://happygitwithr.com/ freeCodeCamp - how to contribute to open source → https://github.com/freeCodeCamp/how-to-contribute-to-open-source/ If you didn’t join live, one great discussion you missed from the zoom chat was about how people manage their personal and work GitHub accounts, and whether to have one account for all their work or separate accounts for each employer. Let us know YOUR thoughts on this topic below! ► Subscribe to Our Channel Here: https://bit.ly/2TzgcOu Follow Us Here: Website: https://www.posit.co Hangout: https://pos.it/dsh LinkedIn: https://www.linkedin.com/company/posit-software Bluesky: https://bsky.app/profile/posit.co Thanks for hanging out with us! #pythoncontent

Jan 16, 2025
56 min

image: thumbnail.jpg

Transcript#

This transcript was generated automatically and may contain errors.

Welcome back to the Data Science Hangout, everybody, and Happy New Year, if I haven't had a chance to see you yet or say that. If we haven't met before, I'm Rachel and I lead customer marketing at Posit. If Posit is new to you and you're joining this Hangout, Posit builds enterprise solutions and open source tools for people who do data science with R and Python. We're also the company formerly called RStudio. I like to add that in there too. But I'm joined by my amazing co-host Libby as well. Hello everybody, I'm Libby. I'm a community manager here at Posit helping to foster our Hangout community and help host the Hangout. And I'm also a Posit Academy mentor where I help professionals do more with data by learning how to use R and Python in their jobs.

So happy to have you all here with us today. The Hangout is our open space to hear what's going on in the world of data across all different industries, get to chat about data science leadership, and connect with other people facing similar things as you. So we get together here every Thursday at the same time, same place. So if you are watching this as a recording on YouTube and you want to join us live in the future, there will be details to add it to your own calendar below.

Thank you so much to those of you here who have helped make this the friendly and welcoming space that it is today. I love getting to see that people are now friends from the Hangout and getting to chat with each other here in the Zoom chat. We're all dedicated to keeping this that friendly environment. So if you ever have feedback about your experience or anything at all that you want to share with me anonymously, good and bad, or even suggestions for topics to dive deeper on, I will share a Google form in the chat with you right now. You can always reach out to me on LinkedIn as well.

And at the Hangout, we love hearing from you. This is a community-driven discussion. This is not like a podcast where Rachel and I are hosting. The questions come from all of you. So we really, really encourage you to get together in the chat, connect with other attendees, briefly introduce yourself, where you are, what you do, what you do for fun, share your LinkedIn, share a link to your website, all of that stuff. And we love hearing from you, no matter your years of experience or your title, your industry, what languages you use or don't use, this is a place for you and we want you to know that this is a place to like hang out with each other and us.

There are three ways to jump in today and ask those questions to get things started. You can raise your hand in Zoom. We'll call you to just unmute and ask your question. You can put your question in the Zoom chat. We will call on you to unmute and ask your question. If you happen to be somewhere where you cannot talk or your mic doesn't work, just put an asterisk somewhere in your question and we'll ask it for you. There's also a Slido link. You can ask questions anonymously if you feel like and that's totally fine as well.

Introducing Rich and Michael

Well, thank you all so much again for being here today. I'm so excited to be joined by our two other co-hosts today, Rich Iannone and Michael Chow, software engineers here at Posit. And we'd love to have you both introduce yourself first and maybe share a little bit about your roles here at Posit, but also what you like to do outside of work too. Rich, do you want to go first? Yeah. So yeah, I'm Rich. I work at Posit. Been there for quite a while, since 2018 or thereabouts. And yeah, working on packages. Started with R, now more lately working on Python packages with Michael. For fun, I like to read, watch movies, play some instruments, go outside sometimes. Maybe not now, it's like 20 degrees out, really chilly. But still, I try to make it outside because, you know, fresh air is good.

So that's basically me. Love it. Michael, you want to go next? Yeah. Hey, I'm Michael Chow. I'm in Philadelphia and working with Rich on Great Tables. In my free time, what do I like to do? I really like to cook a lot. And I've realized lately too, I thrift a ton. I'm just always combing through, I feel like, thrift stores. So a lot of good stuff, you know, out there.

What's your favorite thing you've thrifted? Wow, that's a great question. Actually, I think my favorite thing is something I didn't thrift, but passed on and has haunted me my whole life, which is a year or two ago, there was this beautiful fringy leather jacket that I assume a cowboy died in and then left to this thrift store. And for some reason, I passed on it. But every day, I think that I could have been that fringy cowboy and I gave that opportunity away. But maybe someone else out there now is living their best fringe leather jacket life. So maybe there's like a silver lining to the story. I hope the fringe jacket comes back around to you somewhere.

What are gt and Great Tables?

Well, I know we just kind of introduced yourself, both of you around gt and Great Tables, but I thought it might be really helpful to start off by talking about what those both are, if somebody has never heard of them before.

I can introduce gt and Great Tables. Basically, you need to make tables and you use R or Python, you can use them to make tables. We made that because it's such an obvious missing thing, like static tables, like the non-interactive type you see everywhere, basically. It just wasn't really a good or maintained solution that had different output types that you can just put your data in from a data frame and just get a nice looking table out wherever you need it. So I jumped at the chance to work on this when I found out I could work on this, which was pretty soon after joining Posit, actually, within RStudio.

That is gt, Great Tables, in a nutshell. Yeah, and I think something that drew me to it, too, was that I went to a Posit conf and I saw all the people interested in tables, and it really knocked me back, because in Python I had never styled a table before, and so I felt like I was missing out on this big party, and people were coming up to Rich. I saw Daniel, who does gt summary, chatting with Rich. There were these gt heads, and so I feel like that really wanted me, as a Python user, to get in on the action.

Promoting a package and community engagement

That is a great point. Rich is really great at engaging the community and getting people talking about and just engaging around a software thing in general. I feel like that's a talent, Rich. I would love to know if you have any tips on how you go about promoting a package. There are so many people out there who have made amazing things that they don't talk about very much and don't get used a lot. Yeah, basically, just don't be shy, like I was before. Just get out there and say things. More importantly, have stuff to talk about. Add new features. Ask what people want. Answer questions. Do everything you possibly can in the time that you have. I think it's helpful just to be there, essentially, and listen. If people want a feature, don't say, no, no, I don't want that. Just make the feature happen, I think, if it's within reason, I think. That's been my thing. So yeah, just getting out there, talking a whole lot.

Do you feel like LinkedIn, talking on LinkedIn, was the best way to go about that? Or do you think there's other avenues that are better these days? LinkedIn gets the highest number of impressions. I mean, I worked hardest at LinkedIn. It's kind of weird, because I've got a lot of contacts and followers, and maybe that was to my advantage. But I found LinkedIn gets the highest reception of basically any other social network. So I'm trying Blue Sky. I'm trying to get in there and post things, but it's kind of slow going. It really helps if you have a big account to start. But even if you don't, it's totally fine. You can just get started somewhere. So yeah, LinkedIn, for me, is kind of where it's at currently.

I feel like Rich is way better at the social media connecting, but I do feel like conferences are so good. Being able to poke around and just ask people what they're using, and also to have the chance to sit by someone and have them pull up something, I think that kind of stuff's really useful. But the other thing I'd flag is that Rich and I think Curtis ran the Posit Table contest, which seemed like a really neat way to kind of connect with people and engage people in the discussion. Yeah, I wanted to celebrate the people who entered the table contest and those that won that.

Every time I see the submissions, I'm like, wow, you can do that with this? You just never imagine it. And you see them and you're like, whoa. I get blown away every single year that we have that contest. It's like, damn, each time.

Connecting at conferences

Well, Michael, I know you just mentioned conferences, so it might be a good time to ask you about. You were at a conference this week. Do you want to tell us a little bit about that? But also, how did you go about connecting with people and starting to talk about the stuff you're working on? Yeah, that's a great question. So I went to the Transportation Research Board annual meeting. So it has, I think, over 13,000 people in DC for all things transportation. I'm really interested in public transit, but TRB also includes things like anything to do with transportation. So roads, there are asphalt people there talking about the best kind of asphalt. But I think what was really useful was I met up with a lot of people at public agencies who were using R and RStudio, and a bunch of people were using gt in Minneapolis's metro planning organization.

It was kind of a funny one because I didn't really know a lot about the area, so I felt kind of like I was cosplaying a transportation person. So this was maybe a funny example of one where I was kind of out of my element. But I feel like going into a really new place and kind of like finding the R and Python users was a good way to see like where are people analyzing data that I otherwise wouldn't really identify quickly. And I felt like those people were really excited to talk because they're like pretty deep in a domain, so it's less likely that they're popping into like PositConf and just like chatting about data science generally.

How did you actually find them? Like you're like the people who are really excited about Python and R, but at this huge conference, how did you find them? So maybe this is a good social thing. I made sure to post on LinkedIn before I went to the conference about a week before, just that I'd be there and like what I was looking for. We cheated a little bit. I put this post on the Great Tables blog. I'll link it here. So I just made a blog post titled Contributing to Public Transit Data Analysis and Tooling. So it's kind of like I tried to set up all the flags before the conference to say like why am I here? What am I looking for? And this blog post really served as almost like a calling card, like a way to explain really easily to people what am I doing, and with the hopes that if they know like a colleague that they'd be able to just pass it to them too. So there was a little bit of setup to kind of make it work with LinkedIn in the blog post.

And this blog post really served as almost like a calling card, like a way to explain really easily to people what am I doing, and with the hopes that if they know like a colleague that they'd be able to just pass it to them too.

Excel-to-gt workflows and table templates

Nice. That's a great tip. I see, Stephanie, you asked a question a little bit earlier. Do you want to jump in here first? Of course. I'm in the middle of eating lunch. Yes, no problem. So my question relates to like a current workflow we have at work that will have people who are not data people make table templates in Excel to define analyses. It really helps us know what they're looking for in an analysis. And then we have someone run the analysis to populate the table. And we use OpenXL SX for this right now. But it would be great if they could somehow make templates that would work with a gt workflow, but they're not our people. And has there been any thoughts about that? Are you saying going from like Excel to gt? Yeah. There's actually a package out that does pretty much this. And like, I didn't put in the gt, like read me like I do for other packages that use gt. I think it's called GTS or something to that effect. And I forgot and I feel bad for not knowing this, but there is like a new, it's new. Like it was just out in the last two, three months. But yeah, it's sweet. It goes from Excel to gt. I'd love to have the other way going. And that's kind of like a thing of promise to the law back, like having gt to Excel. But I think this seems to fit exactly what you need. At least check it out.

Can you do it without data that pre-exists? Because we struggle, sorry I'm so glad you asked this question. We struggle with the same thing, right? And so we're often trying to just come up with like synthetic data to populate a table to then replace it with like a bunch of X's and like placeholders, right? But I really wish there was a way to just come up with a shell that didn't presuppose data exists. Yeah. And I think some approaches take like, have that like gt reg, not gt reg. There's another package that basically populates, has like a plan for like, and doesn't require data. You basically just start with like a template, exactly what you said. And it's a pharma package. And the name totally escapes me again. I'm really bad at coming up with gt affiliates. I see Daniel's, Daniel's going to know. Daniel, what is it? Please Daniel, help me out here. So we're building in the pharma space. We're working a lot with something called Analysis Results Datasets right now. And it's very, very easy to build an empty ARD. That's the Analysis Result Dataset. And if you have an ARD, then you can go straight to tables via gt summary, which we're also kind of generalizing to be able to do kind of anything at this point with ARDs.

ShinyLive compatibility and dependencies

Yes, I'm coming off mute. So one, I had a question because I posted an issue. The most recent version of Great Tables broke ShinyLive compatibility. And I'm just curious how important it is to y'all to keep ShinyLive working with gt. It's the new dependency on CCS inline that doesn't work. So I posted an issue in the GitHub. I just thought I'd mention it here since I got the ears of all of you. And then so you can address that. But at a high level, I do like Great Tables. I've started using it more and more. I think I'm a Python person. So I didn't really use it on the R side. And I posted another comment, I think, recently about bootstrap styles, which I think someone responded to. And I appreciate that feedback. But just at a high level, I just want to encourage you all to think about tables as more than just for numbers or even charts. I use tables a lot in a lot of my web apps and stuff. And obviously, I put buttons in tables. I need links to be conditional on other columns and tables. So just think big when you're thinking about tables. Because I feel like a lot of table packages really focus on formatting numbers or whatever. And you support markdown, which is great. And that really helps me for some things.

Yeah, I totally agree. And I'm doing that, too, actually, using Great Tables as software or something for something else. And you need to go into the guts of Great Tables to tease out a few things you need to program tables. So you can definitely expose more of those things if you want, maybe create an issue for that. And I saw your issue on CSS inline. And what you can do is make that an optional install, because that raw, as raw HTML, doing that one trick of inlining CSS, that seems very extra. So we can definitely make that one package an optional install, so you don't have to break ShinyLive. So that's something we can do. Very cool. Yeah. I do think, too, on the ShinyLive note, now that ShinyLive, so we went on this big arc where another engineer at Posit, George Stagg, just got Polars working in WebAssembly. So ShinyLive, I don't know if now or very soon, should support Polars. Yeah, I'm very excited. I'm very excited about that. I actually rewrote a bunch of code. I had a ShinyLive app and I rewrote a bunch of code to use pandas because I couldn't use Polars in ShinyLive. And then a week later, they were like, oh, Polars is going to work in PyEditor.

Yeah, yeah. So I think that's one of the reasons we haven't been using ShinyLive too much either, is we've been using a lot of Polars in our docs and just working with Great Tables. But now that ShinyLive does or will really soon support Polars, I think we'll start using it quite a bit more for examples and demos and things like that. So hopefully that'll let us kind of keep it in the loop a bit tighter to keep an eye on these kinds of breaking changes. Yeah, and I think we're generally trying to reduce dependencies, like the trail of dependencies on Great Tables. We should do the same thing for gt, but for Great Tables, at least we're going to try to get rid of some things or replace things that make it heavy because of issues like this, essentially.

Table design resources

Oh, sure. Yeah, so I asked it in chat. Just curious if you all have any resources for papers or books on table design principles. I'm putting together a workshop. It's kind of a two-part workshop with table design principles and gt Great Tables. Oh, yeah. We got stuff. We got stuff. There's this old thing that we talk about all the time, this 1949 manual of tabular presentation. It's a goldmine for ideas. I know it's old, but actually it's got a ton of good stuff that's relevant today. For a newer thing, right behind me, there's this book. I'll show me the numbers. Look at this. It even has tables on the front cover. That never happens. I literally bought that on Amazon yesterday. Excellent. Yes, a great book. Of course, it has more on plots, like rafts, they call them, but it has tables, which is amazing. And so there's good stuff there. Other than these two things, it's kind of hard. We've been looking. That's not like we haven't tried. There's not much. Maybe that's where we step in. I don't know.

Reporting issues and contributing

Okay, thank you. So I swear this is not an attempt to make you troubleshoot my Great Tables heat map problem on this call. But it was New Year's Eve, and I was trying to get my table to work, and I couldn't. But my question is really, like, how much work do we need to do in issues to make it useful for you guys when we're reporting an issue? Because I totally, like, did not do the thing where I made it reproducible and reported it on GitHub, because I was like, that seems like a lot of work. So like, how much work do we need to do? Like, what do we need to get you in order to give you an issue that you can actually do something useful with? Well, I think not much. Just, like, we can get the conversation going. Just maybe a screenshot and maybe some code, and then we can just discuss and then, you know, zero in on the actual issue and what needs to be done. Trick is just to start. Don't be shy like I am all the time with issues. Just get in there, and we'll eventually get to the harder problem.

I feel like Rich is way better at the social media connecting, but I do feel like I don't think it hurts, like, to just open an issue, and if you're in the middle of it, just mention. Like, you could, you could have a single sentence that just says, like, super fast what you're seeing. And I think that's totally fair, because worst case, we just ask for more information. I think best case, like, we actually can just read that sentence, and it's, like, something we've thought about or can point to more information. I think that's fair. Like, it's very fast to kind of, like, scan a sentence and either ask for more or, like, maybe we actually know something about it and can help you, like, out right away. And something super effective is just, like, a screenshot marked up with, like, lines or desired things. I've seen that a bunch of times, and that's actually way better than a text description half the time. It just really just gets right to it.

Building and publishing packages

And kind of on this same thread of, like, anxiety or nerves around doing stuff like this, I wanted to ask both you, Rich, and Michael, how many packages did you develop secretly or privately before you were actually comfortable publishing packages and putting them out there and letting people see them? And how many do you have just, like, sitting in the wings or the back burner that you don't talk about? Michael, you go first.

It's such a great question. So many. I just feel like, well, I feel like the frequency of packages has stayed the same. Like, lots of small packages, like, year to year. I would say there's, like, so many, like, pour one out to the ones that didn't make it even out of the gate, like, that are, like, a repo with just an idea where I had a big dream and then gave up on it right away. So I think to your question, like, how many packages have I done before, like, releasing things? I think that so many because I think it's good just to get into the habit of building packages. And, like, it's okay to do it in the open, but I would say there wasn't really, like, a turning point where I was, like, now I can start releasing good packages to the world. I think I just did really bad packages and they got, like, better and better over time. And now there's, like, a healthier mix of, like, good and bad packages. But I would really lean into the joy of putting a bad package into the world as kind of, like, I think at the worst, a bad package is almost like a blog post, like, and giving them a lot of, like, work that you did.

I would really lean into the joy of putting a bad package into the world as kind of, like, I think at the worst, a bad package is almost like a blog post, like, and giving them a lot of, like, work that you did.

So I would say so many packages and still doing a lot of bad packages today. I don't really do them under the radar as much. I try to just do them as a public package. So learning out loud. Yeah. Yeah. Yeah. So much of our advice has come down to, like, just do it anyway, even if you're nervous about it. Rich, what about you? Yeah. I started this, like, 10 years ago, probably around the same time as Michael, maybe a little over 10 years ago. Doesn't matter. A lot of bad packages. I mean, I was learning stuff at the same time, so I didn't mind. But I saw people doing stuff out in the open. I was, like, I want to do that, too. It was great. And, like, some people actually use the packages, the early stuff that I wrote. And, like, it was fun to interact with people and just get to know people. So that was even better than, like, writing the package half the time. It's, like, interacting with people. It's, like, oh, my God, this is amazing. And they would help you out. Blew my mind that people would help out. So, yeah, no regrets about bad packages.

One fun example of a kind of funky package I've been, like, tinkering on for the past few years is this thing called Data Backend. It's not really, like, exciting for data analysis. It's more like something someone might use behind the scenes when making a package. But the reason I bring it up is that if you look at it, it's, like, there's one issue, which is, like, Joe Chang three years ago just collecting cobwebs. And there's no docs. It's just a big readme. But it was really good for me to, like, just put the idea out. And I would give it to people at conferences to kind of check their temperature on it. We start out by just copying this package into Great Tables. So I just copied the Python code into Great Tables. And so in a lot of ways, this repo is just me kind of, like, tinkering on an idea and kind of, like, laying the parts out for people to be able to talk about it. And I've really enjoyed that kind of workflow where it's just, like, I'm not really trying to get people to install it right now. I'm more trying to just have conversations and, like, keep it in one place for chatting with people.

Porting packages between R and Python

Well, on this topic of porting packages, Rich, I know you're working on porting point blank to Python. And this is a question that's come up quite a bit lately in the community. What are the best practices for maintaining equivalent R and Python packages? And what are some of the challenges? Yeah. So best practices, they're pretty much what we make them. Because I'm not aware of very many of them, like, with ports. That's my fault. But I think, like, having a somewhat matched APIs is good. Exactly as, you know, to pipe together and you get some results. So in Python, of course, it's not going to be that. It's going to be a bunch of chain methods with some, you know, class to start things off. But having the names the same, like, or pretty close to the same is great. And features sort of matched up is also great. So if you have, say, you're working in a place that does both, you can have both versions working at the same time, or you can migrate from one to the other pretty painlessly, one hopes. So that's kind of, like, my idea of best practices for porting these things in. Michael, what do you think of all that? Because we did, like, Great Tables in gt, right?

Yeah, that's a really great question. I, okay, I think some of the big challenges are, like, how, I think consistency, like, as long as, like, the longer you stay with the two packages, just kind of, like, very close side by side, the better your life is. And I mean, like, so for example, I ported a package called pins from R to Python. And one thing that was in my head for a long time was, like, I want to be able to look at the Python code, and actually be able to guess where in the R code, the same bit, the same idea is. And even when I thought in my head, maybe there's a better way to, like, name something or lay something out. I stuck with that a long time, because I didn't want to have to think about two packages. I almost wanted to be able to navigate between each of them. And I find that really helpful when porting is, can I, like, think in both of these packages at once? And that I think that's, like, favoring kind of consistency over, like, innovation, when you're translating a package.

But on the other hand, I think if you go too literally, you run the risk of kind of really applying, like, you kind of slow yourself down right out of the gate. And so I think what I often do when translating a package is I get a giant notebook, and I just take really copious notes on the original thing. And, like, a lot of use cases and what it looks like in operation. Just to get a sense for the big picture. So I can make any, like, little tweaks to the design before kind of starting out. So I think it's balancing, like, the consistency of these two things are, like, essentially the same to, like, letting in a little bit of innovation that'll help you kind of move faster.

The naming of Great Tables

Well, real quickly, while we're talking about gt and Great Tables together, I was wondering, like, was the name choice of Great Tables versus, like, GT-Python a conscious branding decision? Oh, yeah. I forgot how it went down. Me and Michael were brainstorming for a while, and then, like, somehow Great Tables entered. Do you remember this, Michael? Because, like, it was, like, such a fateful day. And, like, I think we just struck gold. And it was, like, great moment. Yeah. Yeah, I think what happened is that gt was taken on PyPI. And I think, Trisha, I haven't loved naming packages the same thing across languages, because I think it hurts with kind of reaching the new audience sometimes. Like, people in Python don't like to be called something Py. You know, I think they like to be their own thing. But I think gt was taken on PyPI. So we had a big dilemma, which was we can't name this package this thing. And I think we, in talking, I didn't even know what gt stood for. Enrichment mentioned it originally meant grammar of tables. Yeah, but I think it's sort of, like, minimal. I didn't, like, never said grammar of tables. It's not mentioned in the docs. Yeah, it's not in the docs anywhere. I think we realized there was a chance, there was a little tiny chance to, like, rewrite history and just go back in time and pretend, like, imagine that gt stands for Great Tables. So it's almost like an Easter egg for our people. But for Python people, it feels like an original name. And it's available to pip install.

Editable tables and data entry

In some of the shiny apps that we build, we've experimented with, like, our hands-on table or DT. Usually, we use DT. But, like, the mechanics of data entry, pushing data back to a server or S3 or something and getting the data back or, you know, using something where you're polling so that the tables that, you know, populate other parts of the app or other people that are on the same app, you know, like, getting it all to work fluidly, it's just nasty in DT. And I didn't know if there's any, I don't use gt, first off, for Great Tables. I wish I did. I just don't really have a need for it right now in my role. But I work with people who potentially could. And if there was a way to do data entry with it, I think that would be awesome.

Yeah, I think for data entry, they have the data grid, which is designed to be editable. I feel like, if you're talking about, like, yeah, being able to show a table and then let people edit the values inside the table. That's right. Yeah, exactly. I think it's tricky. Like, you can kind of do this in Excel if you, like, format a table in Excel. Obviously, you can, like, edit all the cells and update. It feels like whenever we talk with engineers about editable tables, that it's almost like its own kind of beast. It, like, brings in so many tricky dynamics, like needing to kind of re-render everything and all that, that it almost feels like it's been easier to kind of, like, let another thing be the editable table, like the Shiny Data Grid, and then gt be just the kind of, like, static.

Learning software development and career advice

Sure. Thanks, Rachel. This was for Michael who were, and maybe Rich as well, if you had an experience like this. But Michael, you mentioned doing some work on a package while you were doing a PhD. And, you know, you were kind of learning some of this stuff while you were doing your PhD in psych. And what I'm curious about is how you went about learning the software development stuff that you needed to know to build packages while you were doing that.

Yeah, that's a good question. I think looking back, well, the one big thought I have is that when I was doing research and kind of trying to package up my analyses, I feel like both those things are so big that it was, I think it always ended up just better to focus on one thing. Like a lot of times with the research, the research itself is often so involved that to research and package is kind of a big job. I feel like in retrospect, what happened often was if you can, like, make things reasonably nice, right, and reasonably reusable, it's like, if you end up using them for, like, across, like, a couple pieces of research, then you're in a good position to start thinking about packaging. But in retrospect, I think I really would have, like, really done, like, the research and then maybe, like, toggled to packaging a little bit and then gotten back into research.

But in terms of resources, I think, yeah, I wish I had good suggestions. I think I did a lot of the classic things and just read internet tutorials. And I do think for our things like the use this package is really sort of indispensable. And, like, have this book on package development is really great. But I think the thing I would do today is just really focus on this idea of the rule of three, which is, like, before you try to, like, consolidate things into a function or a package, just use the code and write it out, like, three times or in three use cases. And then once you have those use cases, you're in a good place to kind of go back and really think about how would I consolidate this. I feel like that would probably be the most useful thing for me because that would let me, like, do the job in a realistic way and then go back and kind of think about how would I kind of consolidate a lot of this and spend time, like, studying and figuring it out.

Yeah. Same thing happened for me, for learning, like, mechanics of, like, workflows and stuff. It kind of, like, people would just say, why don't you do this? I'm like, oh, yeah, maybe I'll do that. I'll look into that. And then it just sort of happens, right? When you're in it, you can't help but do things that people do because you get sometimes nudged in those directions. It's kind of weird how that happens. I felt like I was just bumping around. I mean, I got it done, right? But I felt like I was like, okay, I'm going to do this now. I'm going to try this thing that I saw on this blog or whatever. And it all worked. And I got,