diff --git a/code/load_accounts.py b/code/load_accounts.py index 0970503..d24b37d 100644 --- a/code/load_accounts.py +++ b/code/load_accounts.py @@ -1,18 +1,21 @@ import polars as pl import json -def get_fullweek_status_count(x: str): +def get_fullweek_status_count(x: str, attr): try: data = json.loads(x) - return int(data[1]["logins"]) + return int(data[1][attr]) except: return -1 def read_activity_file(f): - return pl.read_ipc("data/activity.feather").filter( + return pl.read_ipc(f).filter( pl.col("data_string").str.starts_with('[{"week":') ).with_columns( - pl.col("data_string").map_elements(lambda x: get_fullweek_status_count(x)).alias('logins') + pl.col("data_string").map_elements(lambda x: get_fullweek_status_count(x, "week")).alias('week'), + pl.col("data_string").map_elements(lambda x: get_fullweek_status_count(x, "logins")).alias('logins'), + pl.col("data_string").map_elements(lambda x: get_fullweek_status_count(x, "statuses")).alias('statuses'), + pl.col("data_string").map_elements(lambda x: get_fullweek_status_count(x, "registrations")).alias('registrations'), ).sort("logins") def read_metadata_file(f): @@ -34,7 +37,11 @@ def read_metadata_file(f): ) def read_accounts_file(f): - df = pl.read_ipc(f).with_columns( + return pl.read_ipc(f).filter( + pl.col("data_string").str.contains('"pleroma":').not_() + #).filter( + #pl.col("data_string").str.starts_with('{"id"') + ).with_columns( pl.col("data_string").str.json_decode().alias("data") ).with_columns( pl.col("data").struct.field("id"), @@ -58,10 +65,6 @@ def read_accounts_file(f): pl.col("data").struct.field("statuses_count"), pl.col("data").struct.field("last_status_at"), pl.col("data").struct.field("noindex"), - pl.col("data").struct.field("emojis"), - pl.col("data").struct.field("roles"), - pl.col("data").struct.field("fields"), - pl.col("data").struct.field("suspended"), ).with_columns( pl.when( pl.col("last_status_at").str.len_chars() > 10).then( @@ -70,4 +73,3 @@ def read_accounts_file(f): pl.col("last_status_at").str.strptime(pl.Datetime, format='%Y-%m-%d', strict=False).dt.replace_time_zone("UTC") ).alias("last_status_at") ) - return df \ No newline at end of file diff --git a/index.qmd b/index.qmd index e4dbd47..4a31c62 100644 --- a/index.qmd +++ b/index.qmd @@ -1,5 +1,5 @@ --- -title: Onboarding The Fediverse (working title) +title: Best Practices for Onboarding on the Fediverse short-title: Onboarding Fediverse authors: - name: Carl Colglazier @@ -27,6 +27,7 @@ acm-metadata: #isbn: 978-1-4503-XXXX-X/18/06 format: acm-pdf: + keep-tex: true documentclass: acmart classoption: [acmsmall,manuscript,screen,authorversion,nonacm,timestamp] abstract: | @@ -48,6 +49,10 @@ library(network) library(survival) library(ggsurvfit) library(modelsummary) +library(randomForestSRC) +library(grid) +library(scales) + options(arrow.skip_nul = TRUE) ``` @@ -73,7 +78,9 @@ All online communities and accounts trend toward death. # Empirical Setting -The Fediverse is a set of decentralized online social networks which interoperate using shared protocols like ActivityPub. Mastodon is a software program used by many Fediverse servers and offers a user experience similar to the Tweetdeck client for Twitter. +The Fediverse is a set of decentralized online social networks which interoperate using shared protocols like ActivityPub. + +Mastodon is a software program used by many Fediverse servers and offers a user experience similar to the Tweetdeck client for Twitter. It was first created in late 2016. Discovery has been challenging on Masotodon. The developers and user base tend to be skeptical of algorithmic intrusions, instead opting for timelines which only show posts in reverse chronological order. Search is also difficult. Public hashtags are searchable, but most servers have traditionally not supported searching keywords or simple strings. Accounts can only be searched using their full `username@server` form. @@ -89,28 +96,48 @@ Mastodon offers its users high levels of data portability. Users can move their #| output: false from code.load_accounts import * +from urllib.parse import urlparse -accounts = read_accounts_file("data/accounts.feather") +#accounts = pl.concat( +# read_accounts_file("data/accounts.feather"), +# read_accounts_file("data/account_lookup_2023.feather") +#) +accounts = read_accounts_file( + "data/account_lookup_compressed.feather" +).unique(["account", "server"]) # Write a parsed accounts file for R to use -accounts.with_columns( - pl.col("data").struct.field("moved").is_not_null().alias("has_moved") -).drop( - ["data", "data_string"] +a = accounts.with_columns( + pl.col("url").map_elements( + lambda x: urlparse(x).netloc.encode().decode('idna') + ).alias("host"), + pl.col("data_string").str.contains("""\"moved\": \{""").alias("has_moved"), + pl.col("data").struct.field("suspended"), +) + +a_save = a.drop(["data", "data_string"]) +a_save.select( + sorted(a_save.columns) ).write_ipc("data/scratch/accounts.feather") -moved_accounts = accounts.with_columns( +moved_accounts = a.filter(pl.col("has_moved")).with_columns(# Do this again now we know the rows are all moved accounts + pl.col("data_string").str.json_decode().alias("data") +).with_columns( pl.col("data").struct.field("moved") ).drop_nulls("moved").with_columns( pl.col("moved").struct.field("acct").alias("moved_acct"), -).filter( - pl.col("moved_acct").str.contains('@') ).with_columns( - pl.col("moved_acct").str.split('@').list.get(1).alias("moved_server") + pl.when( + pl.col("moved_acct").str.contains('@') + ).then( + pl.col("moved_acct").str.split('@').list.get(1) + ).otherwise( + pl.col("server") + ).alias("moved_server") ) -number_of_accounts = len(accounts) +number_of_accounts = len(a) -popular_servers = accounts.group_by("server").count().sort("count", descending=True) +popular_servers = a.group_by("server").count().sort("count", descending=True) common_moves = moved_accounts.group_by( ["server", "moved_server"] @@ -134,57 +161,181 @@ read_metadata_file("data/metadata_2023-10-01.feather").drop( ).write_ipc("data/scratch/metadata.feather") ``` -```{r} -#| label: r-load-accounts +```{python} +#| label: py-preprocess-data2 +#| cache: true #| output: false -accounts <- arrow::read_feather("data/scratch/accounts.feather", col_select=c("server", "username", "created_at", "last_status_at", "statuses_count", "has_moved", "bot")) %>% - filter(!has_moved) %>% + +from code.load_accounts import read_accounts_file +from urllib.parse import urlparse +import polars as pl + +profile_accounts = read_accounts_file("data/profiles_local.feather") +p = profile_accounts.with_columns( + pl.col("url").map_elements(lambda x: urlparse(x).netloc.encode().decode('idna')).alias("host"), + pl.col("username").alias("account"), + pl.lit(False).alias("has_moved"), + pl.lit(False).alias("suspended") +).drop( + ["data", "data_string"] +) +p.select(sorted(p.columns)).write_ipc("data/scratch/accounts_processed_profiles.feather") +all_accounts = pl.scan_ipc( + [ + "data/scratch/accounts.feather", + #"data/scratch/accounts_processed_recent.feather", + "data/scratch/accounts_processed_profiles.feather" + ]).collect() +all_accounts.filter(pl.col("host").eq(pl.col("server"))).unique(["account", "server"]).write_ipc("data/scratch/all_accounts.feather") +``` + + +```{r} +#| eval: false +arrow::read_feather( + "data/scratch/accounts.feather", + col_select = c( + "server", "username", "created_at", + "last_status_at", "statuses_count", + "has_moved", "bot", "suspended" + )) %>% + mutate(suspended = replace_na(suspended, FALSE)) %>% filter(!bot) %>% # TODO: what's going on here? filter(!is.na(last_status_at)) %>% # sanity check filter(created_at >= "2022-01-01") %>% - filter(created_at < "2023-03-01") %>% - # We don't want accounts that were created and then immediately stopped being active - filter(statuses_count >= 5) %>% - filter(last_status_at >= created_at) %>% - mutate(active = last_status_at >= "2023-09-01") %>% - # set max last_status_at to 2023-06-01 - mutate(last_status_at = ifelse(active, lubridate::ymd_hms("2023-09-01 00:00:00", tz = "UTC"), last_status_at)) %>% - mutate(active_time = difftime(last_status_at, created_at, units="secs")) + filter(created_at < "2024-03-01") %>% + # We don't want accounts that were created + # and then immediately stopped being active + filter(statuses_count > 1) %>% + filter(!suspended) %>% + filter(!has_moved) %>% + #filter(last_status_at >= created_at) %>% + mutate(created_month = format(created_at, "%Y-%m")) %>% + group_by(created_month) %>% + summarize(count=n()) %>% + distinct(created_month, count) %>% + ggplot(aes(x=created_month, y=count)) + + geom_bar(stat="identity", fill="black") + + labs(y="Count", x="Created Month") + + theme_bw() + theme(axis.text.x = element_text(angle = 90, hjust = 1)) ``` -**Mastodon Profiles**: We collected accounts using data previously collected from posts on public Mastodon timelines from October 2020 to February 2023. We then queried for up-to-date infromation on those accounts including their most recent status and if the account had moved. This gave us a total of `r nrow(accounts)` accounts. - - ```{r} -adv_server_counts <- arrow::read_feather("data/scratch/accounts.feather", col_select=c("server", "username", "created_at", "bot")) %>% +#| label: fig-account-timeline +#| fig-cap: "Accounts in the dataset created between January 2022 and March 2023. The top panels shows the proportion of accounts still active 45 days after creation, the proportion of accounts that have moved, and the proportion of accounts that have been suspended. The bottom panel shows the count of accounts created each week. The dashed vertical lines in the bottom panel represent the annoucement day of the Elon Musk Twitter acquisition, the acquisition closing day, and a day when Twitter experienced an outage and started rate limiting accounts." +#| fig-height: 3 +#| fig-width: 6.75 +accounts_unfilt <- arrow::read_feather("data/scratch/all_accounts.feather", col_select=c("server", "username", "created_at", "last_status_at", "statuses_count", "has_moved", "bot", "suspended", "host")) %>% + filter(server == host) +accounts <- accounts_unfilt filter(!bot) %>% - filter(created_at > "2017-01-01") %>% - filter(created_at <= "2023-01-01") %>% - group_by(server) %>% - arrange(created_at) %>% - mutate(r = row_number()) %>% - arrange(desc(r)) %>% - distinct(server, created_at, .keep_all=TRUE) %>% - select(server, created_at, r) %>% - ungroup() %>% - mutate(server_date = as.Date(created_at)) + # TODO: what's going on here? + filter(!is.na(last_status_at)) %>% + mutate(suspended = replace_na(suspended, FALSE)) %>% + # sanity check + filter(created_at >= "2022-01-01") %>% + filter(created_at < "2023-08-01") %>% + # We don't want accounts that were created and then immediately stopped being active + filter(statuses_count >= 1) %>% + filter(last_status_at >= created_at) %>% + mutate(active = last_status_at >= "2024-01-01") %>% + mutate(last_status_at = ifelse(active, lubridate::ymd_hms("2024-01-01 00:00:00", tz = "UTC"), last_status_at)) %>% + mutate(active_time = difftime(last_status_at, created_at, units="days")) %>% + filter(!has_moved) +acc_data <- accounts_unfilt %>% + mutate(created_month = format(created_at, "%Y-%m")) %>% + mutate(created_week = floor_date(created_at, unit = "week")) %>% + mutate(active = active_time >= 45) %>% + group_by(created_week) %>% + summarize( + Suspended = sum(suspended)/n(), + Active = (sum(active)-sum(has_moved)-sum(suspended))/(n()-sum(has_moved)-sum(suspended)), + Moved=sum(has_moved)/n(), + count=n()) %>% + pivot_longer(cols=c("Active", "Moved", "Suspended"), names_to="Measure", values_to="value") +theme_bw_small_labels <- function(base_size = 9) { + theme_bw(base_size = base_size) %+replace% + theme( + plot.title = element_text(size = base_size * 0.8), + plot.subtitle = element_text(size = base_size * 0.75), + plot.caption = element_text(size = base_size * 0.7), + axis.title = element_text(size = base_size * 0.9), + axis.text = element_text(size = base_size * 0.8), + legend.title = element_text(size = base_size * 0.9), + legend.text = element_text(size = base_size * 0.8) + ) +} +p1 <- acc_data %>% + ggplot(aes(x=as.Date(created_week), group=1)) + + geom_line(aes(y=value, group=Measure, color=Measure)) + + geom_point(aes(y=value, color=Measure)) + + scale_y_continuous(limits = c(0, 1.0)) + + labs(y="Proportion") + scale_x_date(labels=date_format("%Y-%U"), breaks = "4 week") + + theme_bw_small_labels() + + theme(axis.title.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank()) +p2 <- acc_data %>% + distinct(created_week, count) %>% + ggplot(aes(x=as.Date(created_week), y=count)) + + geom_bar(stat="identity", fill="black") + + geom_vline( + aes(xintercept = as.numeric(as.Date("2022-10-27"))), + linetype="dashed", color = "black") + + #geom_text( + # aes(x=as.Date("2022-10-27"), + # y=max(count), + # label=" Elon Musk Twitter Acquisition Completed"), + # vjust=-1, hjust=0, color="black") + + geom_vline( + aes(xintercept = as.numeric(as.Date("2022-04-14"))), + linetype="dashed", color = "black") + + # https://twitter.com/elonmusk/status/1675187969420828672 + geom_vline( + aes(xintercept = as.numeric(as.Date("2023-07-01"))), + linetype="dashed", color = "black") + + #scale_y_continuous(limits = c(0, max(acc_data$count) + 100000)) + + labs(y="Count", x="Created Week") + + theme_bw_small_labels() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + scale_x_date(labels=date_format("%Y-%U"), breaks = "4 week") +#grid.draw(rbind(ggplotGrob(p1), ggplotGrob(p2), size = "last")) +library(patchwork) +p1 + p2 + plot_layout(ncol = 1) ``` -```{r} -adv_server_counts %>% filter(server == "mastodon.social") %>% - ggplot(aes(x=server_date, y=r)) + - geom_line() + theme_minimal() -``` +**Mastodon Profiles (2022)**: We collected accounts using data previously collected from posts on public Mastodon timelines from October 2020 to January 2024. We then queried for up-to-date information on those accounts including their most recent status and if the account had moved. This gave us a total of `r nrow(accounts)` accounts, of which `r accounts %>% ` We selected accounts created after January 1, 2022 and before August 1, 2023 and which posted least one status. ```{r} #| label: fig-account-activity-prop #| fig-cap: "Account Activity Over Time" #| fig-height: 4 +#| eval: false +study_period <- 45 +#formerly accounts_processed_recent +accounts_unfilt <- arrow::read_feather("data/scratch/all_accounts.feather", col_select=c("server", "host", "username", "created_at", "last_status_at", "statuses_count", "has_moved", "bot", "uri", "suspended")) %>% + filter(server == host) %>% + filter(bot != TRUE) %>% + mutate(suspended = replace_na(suspended, FALSE)) %>% + filter(suspended != TRUE) %>% + # TODO: what's going on here? + filter(!is.na(last_status_at)) %>% + # sanity check + filter(created_at >= "2023-10-15") %>% filter(created_at < "2024-01-01") %>% + # We don't want accounts that were created and then immediately stopped being active + filter(statuses_count >= 1) %>% + filter(last_status_at >= created_at) %>% + mutate(active_time = difftime(last_status_at, created_at, units="days")) %>% + select(server, username, created_at, active_time, last_status_at, has_moved) %>% + mutate(active = active_time >= study_period) %>% + mutate(active_time = ifelse(active_time > study_period, study_period, active_time)) -server_counts <- arrow::read_feather("data/scratch/accounts.feather", col_select=c("server", "username", "created_at", "bot")) %>% - filter(created_at <= "2023-01-01") %>% +accounts <- accounts_unfilt %>% filter(!has_moved) + +server_counts <- arrow::read_feather( + "data/scratch/accounts.feather", + col_select=c("server", "username", "created_at", "bot") + ) %>% + filter(created_at <= "2023-03-01") %>% + filter(!bot) %>% group_by(server) %>% summarize(server_count = n()) %>% arrange(desc(server_count)) %>% @@ -195,14 +346,29 @@ metadata <- arrow::read_feather("data/scratch/metadata.feather", col_select=c("s mutate(server_count = user_count) %>% mutate(server_count_bin = floor(log10(server_count))) +activity <- arrow::read_feather( + "data/scratch/activity.feather", + col_select = c("server", "logins") + ) %>% + arrange(desc(logins)) %>% + mutate(server_count = logins) %>% + mutate(server_count_bin = floor(log10(server_count))) %>% + # Merge 4 and 5 + mutate(server_count_bin = ifelse(server_count_bin >= 5, 4, server_count_bin))# %>% + # Merge 2 and 3 + #mutate(server_count_bin = ifelse(server_count_bin == 3, 2, server_count_bin)) + jm <- arrow::read_feather("data/scratch/joinmastodon.feather") a <- accounts %>% - inner_join(metadata, by="server") %>% - mutate(metadata = server_count > 500) %>% + inner_join(activity, by="server") %>% + mutate(large_server = server_count > 1000) %>% mutate(active_time = as.integer(active_time)) %>% - mutate(active_time_weeks = active_time / 60 / 60 / 24 / 7) %>% - mutate(status = ifelse(active, 0, 1)) %>% mutate(jm = server %in% jm$domain)# %>% filter(jm) + mutate(active_time_weeks = active_time) %>% + mutate(status = ifelse(active, 0, 1)) %>% + mutate(jm = server %in% jm$domain) %>% + filter(server_count > 0) + survfit2(Surv(active_time_weeks, status) ~ server_count_bin, data = a) %>% ggsurvfit() + @@ -210,27 +376,42 @@ survfit2(Surv(active_time_weeks, status) ~ server_count_bin, data = a) %>% scale_y_continuous(limits = c(0, 1)) + labs( y = "Overall survival probability", - x = "Time (weeks)", - colour = "Server Size (log10)", - fill = "Server Size (log10)", + x = "Time (days)", ) + - add_risktable() + scale_x_continuous( - breaks = seq(0, max(a$active_time_weeks, na.rm = TRUE), by = 52), - labels = seq(0, max(a$active_time_weeks, na.rm = TRUE), by = 52) + breaks = seq(0, max(a$active_time_weeks, na.rm = TRUE), by = 4), + labels = seq(0, max(a$active_time_weeks, na.rm = TRUE), by = 4) ) + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) ``` - To determine the relationship between server size and user retention, we... +```{r} +#| eval: false +sel_a <- a %>% + #filter(created_at >= "2022-06-27") %>% + #filter(created_at < "2022-08-26") %>% #%>% mutate(jm = as.integer(jm)) + mutate(is_ms = server == "mastodon.social") +cx <- coxph(Surv(active_time_weeks, status) ~ log10(server_count) + jm, data = sel_a) +cz <- cox.zph(cx) +#plot(cz) +cx +``` + +```{r} +#| eval: false +obj <- rfsrc(Surv(active_time_weeks, status) ~ server_count_bin + jm, data = (a %>% sample_n(1000)), ntree=5000) +plot(get.tree(obj, 0)) +``` + ## Moved Accounts ```{r} #| label: fig-moved-accounts #| fig-height: 4 +#| eval: false moved_accounts <- arrow::read_feather("data/scratch/moved_accounts.feather") popular_servers <- arrow::read_feather("data/scratch/popular_servers.feather") server_movement_data <- left_join( @@ -250,31 +431,63 @@ server_movement_data %>% If there was no relationship, we would expect these jumps to be random with respect to server size. ```{r} - -popular_servers <- arrow::read_feather("data/scratch/popular_servers.feather") -moved_accounts <- arrow::read_feather("data/scratch/moved_accounts.feather") -activity <- arrow::read_feather("data/scratch/activity.feather", col_select=c("server", "logins")) %>% arrange(desc(logins)) - -popular_and_large_servers <- popular_servers %>% filter(count >= 1) %>% +popular_servers <- + arrow::read_feather("data/scratch/popular_servers.feather") +moved_accounts <- + arrow::read_feather("data/scratch/moved_accounts.feather") %>% + # Remove loops + filter(server != moved_server) +activity <- + arrow::read_feather("data/scratch/activity.feather", + col_select = c("server", "logins")) %>% + arrange(desc(logins)) +popular_and_large_servers <- + popular_servers %>% filter(count >= 1) %>% mutate(count = log10(count)) - jm <- arrow::read_feather("data/scratch/joinmastodon.feather") - -ma <- moved_accounts %>% filter(server %in% popular_and_large_servers$server) %>% filter(moved_server %in% popular_and_large_servers$server) - -edgeNet<-network(ma,matrix.type="edgelist") - -edgeNet%v%"user_count" <- left_join((as_tibble(edgeNet%v%'vertex.names') %>% rename(server=value)), popular_and_large_servers, by="server") %>% select(count) %>% unlist() - -edgeNet%v%"in_jm" <- as_tibble(edgeNet%v%'vertex.names') %>% mutate(in_jm = value %in% jm$domain) %>% select(in_jm) %>% unlist() +ma <- moved_accounts %>% + filter(server %in% popular_and_large_servers$server) %>% + filter(moved_server %in% popular_and_large_servers$server) +# Construct network +edgeNet <- network(ma, matrix.type = "edgelist") +edgeNet %v% "user_count" <- + left_join((as_tibble(edgeNet %v% 'vertex.names') %>% rename(server = value)), + popular_and_large_servers, + by = "server") %>% + select(count) %>% + unlist() +edgeNet %v% "in_jm" <- + as_tibble(edgeNet %v% 'vertex.names') %>% + mutate(in_jm = value %in% jm$domain) %>% + select(in_jm) %>% unlist() ``` +We construct an exponential family random graph model (ERGM) where nodes represent servers and weighted directed edges represent the number of accounts that moved between servers. + +$$ +\begin{aligned} +\text{Sum}_{i,j} = & \beta_1 (log10(\text{user count}_j) - log10(\text{user count}_i)) + \\ +& \beta_2 \\ +& \beta_3 \\ +& \beta_4 \\ +\end{aligned} +$$ + ```{r} #| label: ergm-model #| cache: true -m1 <- ergm(edgeNet ~ sum + diff("user_count", pow=1, form="sum") + nodecov("user_count", form="sum") + nodematch("in_jm", diff=TRUE, form="sum"), response="count", reference=~Binomial(3)) +m1 <- + ergm( + edgeNet ~ sum + + diff("user_count", pow = 1, form = "sum") + + nodecov("user_count", form = "sum") + + nodematch("in_jm", diff = TRUE, form = "sum"), + response = "count", + reference = ~ Binomial(3), + control=control.ergm(parallel=4, parallel.type="PSOCK") + ) -save(m1, file="data/scratch/ergm-model.rda") +save(m1, file = "data/scratch/ergm-model.rda") ``` @@ -285,16 +498,19 @@ ergm_model <- load("data/scratch/ergm-model.rda") modelsummary( m1, + escape = FALSE, coef_rename = c( - "sum" = "Intercept", - "diff.sum.t-h.user_count " = "User Count Difference", - "nodecov.sum.user_count " = "User Count (Node Covariate)", - "nodematch.sum.in_jm.TRUE" = "In JoinMastodon (Both True)", - "nodematch.sum.in_jm.FALSE" = "In JoinMastodon (Both False)" + "sum" = "\\beta_0 Intercept", + "diff.sum.t-h.user_count" = "\\beta_1 User Count Difference", + "nodecov.sum.user_count" = "\\beta_2 User Count (Node Covariate)", + "nodematch.sum.in_jm.TRUE" = "\\beta_3 In JoinMastodon (Both True)", + "nodematch.sum.in_jm.FALSE" = "\\beta_4 In JoinMastodon (Both False)" ), ) ``` +We find a strong preference for accounts to move from large servers to smaller servers. + ```{python} #| eval: false #| include: false @@ -316,4 +532,6 @@ sim_counts = simulations.join(popular_servers, how="inner", on="server").rename( ## Tag Clusters -We found _number_ posts which contained between two and five tags. \ No newline at end of file +We found _number_ posts which contained between two and five tags. + +# References {#references} diff --git a/junior-sheer.Rproj b/junior-sheer.Rproj new file mode 100644 index 0000000..d063e8b --- /dev/null +++ b/junior-sheer.Rproj @@ -0,0 +1,13 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: knitr +LaTeX: pdfLaTeX diff --git a/references.bib b/references.bib index 78912ed..5881c0c 100644 --- a/references.bib +++ b/references.bib @@ -1,3 +1,19 @@ +@article{cavaDriversSocialInfluence2023, + title = {Drivers of Social Influence in the {{Twitter}} Migration to {{Mastodon}}}, + author = {Cava, Lucio La and Aiello, Luca Maria and Tagarelli, Andrea}, + year = {2023}, + month = dec, + journal = {Scientific Reports}, + volume = {13}, + number = {1}, + pages = {21626}, + issn = {2045-2322}, + doi = {10.1038/s41598-023-48200-7}, + urldate = {2024-02-02}, + abstract = {The migration of Twitter users to Mastodon following Elon Musk's acquisition presents a unique opportunity to study collective behavior and gain insights into the drivers of coordinated behavior in online media. We analyzed the social network and the public conversations of about 75,000 migrated users and observed that the temporal trace of their migrations is compatible with a phenomenon of social influence, as described by a compartmental epidemic model of information diffusion. Drawing from prior research on behavioral change, we delved into the factors that account for variations of the effectiveness of the influence process across different Twitter communities. Communities in which the influence process unfolded more rapidly exhibit lower density of social connections, higher levels of signaled commitment to migrating, and more emphasis on shared identity and exchange of factual knowledge in the community discussion. These factors account collectively for 57\% of the variance in the observed data. Our results highlight the joint importance of network structure, commitment, and psycho-linguistic aspects of social interactions in characterizing grassroots collective action, and contribute to deepen our understanding of the mechanisms that drive processes of behavior change of online groups.}, + langid = {english} +} + @article{fieslerMovingLandsOnline2020, title = {Moving across Lands: Online Platform Migration in Fandom Communities}, shorttitle = {Moving across Lands}, diff --git a/renv.lock b/renv.lock index 5826379..b37b6ba 100644 --- a/renv.lock +++ b/renv.lock @@ -14,6 +14,1583 @@ "Name": "./renv/python/virtualenvs/renv-python-3.12" }, "Packages": { + "DBI": { + "Package": "DBI", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "9b4993e98e0e19da84c168460c032fef" + }, + "DEoptimR": { + "Package": "DEoptimR", + "Version": "1.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "stats" + ], + "Hash": "72f87e0092e39384aee16df8d67d7410" + }, + "DiagrammeR": { + "Package": "DiagrammeR", + "Version": "1.0.10", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "RColorBrewer", + "downloader", + "dplyr", + "glue", + "htmltools", + "htmlwidgets", + "igraph", + "magrittr", + "purrr", + "readr", + "rlang", + "rstudioapi", + "scales", + "stringr", + "tibble", + "tidyr", + "viridis", + "visNetwork" + ], + "Hash": "f3de4a4878163a4629a528bbcc6e655d" + }, + "MASS": { + "Package": "MASS", + "Version": "7.3-60", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "methods", + "stats", + "utils" + ], + "Hash": "a56a6365b3fa73293ea8d084be0d9bb0" + }, + "Matrix": { + "Package": "Matrix", + "Version": "1.6-1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "grid", + "lattice", + "methods", + "stats", + "utils" + ], + "Hash": "1a00d4828f33a9d690806e98bd17150c" + }, + "R6": { + "Package": "R6", + "Version": "2.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "470851b6d5d0ac559e9d01bb352b4021" + }, + "RColorBrewer": { + "Package": "RColorBrewer", + "Version": "1.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "45f0398006e83a5b10b72a90663d8d8c" + }, + "Rcpp": { + "Package": "Rcpp", + "Version": "1.0.12", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods", + "utils" + ], + "Hash": "5ea2700d21e038ace58269ecdbeb9ec0" + }, + "RcppTOML": { + "Package": "RcppTOML", + "Version": "0.2.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "Rcpp" + ], + "Hash": "c232938949fcd8126034419cc529333a" + }, + "Rdpack": { + "Package": "Rdpack", + "Version": "2.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods", + "rbibutils", + "tools", + "utils" + ], + "Hash": "3e1384ada5d3948b392e98b11434d972" + }, + "arrow": { + "Package": "arrow", + "Version": "14.0.0.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "assertthat", + "bit64", + "cpp11", + "glue", + "methods", + "purrr", + "rlang", + "stats", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "042f2ee2286a91abe5a3d66c9be92380" + }, + "askpass": { + "Package": "askpass", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "sys" + ], + "Hash": "cad6cf7f1d5f6e906700b9d3e718c796" + }, + "assertthat": { + "Package": "assertthat", + "Version": "0.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "tools" + ], + "Hash": "50c838a310445e954bc13f26f26a6ecf" + }, + "backports": { + "Package": "backports", + "Version": "1.4.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "c39fbec8a30d23e721980b8afb31984c" + }, + "base64enc": { + "Package": "base64enc", + "Version": "0.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "543776ae6848fde2f48ff3816d0628bc" + }, + "bayestestR": { + "Package": "bayestestR", + "Version": "0.13.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "datawizard", + "graphics", + "insight", + "methods", + "stats", + "utils" + ], + "Hash": "61f643ea5ee9fe0e70ab0246340b3c2e" + }, + "bit": { + "Package": "bit", + "Version": "4.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "d242abec29412ce988848d0294b208fd" + }, + "bit64": { + "Package": "bit64", + "Version": "4.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bit", + "methods", + "stats", + "utils" + ], + "Hash": "9fe98599ca456d6552421db0d6772d8f" + }, + "blob": { + "Package": "blob", + "Version": "1.2.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods", + "rlang", + "vctrs" + ], + "Hash": "40415719b5a479b87949f3aa0aee737c" + }, + "broom": { + "Package": "broom", + "Version": "1.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "backports", + "dplyr", + "ellipsis", + "generics", + "glue", + "lifecycle", + "purrr", + "rlang", + "stringr", + "tibble", + "tidyr" + ], + "Hash": "fd25391c3c4f6ecf0fa95f1e6d15378c" + }, + "bslib": { + "Package": "bslib", + "Version": "0.6.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "base64enc", + "cachem", + "grDevices", + "htmltools", + "jquerylib", + "jsonlite", + "lifecycle", + "memoise", + "mime", + "rlang", + "sass" + ], + "Hash": "c0d8599494bc7fb408cd206bbdd9cab0" + }, + "cachem": { + "Package": "cachem", + "Version": "1.0.8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "fastmap", + "rlang" + ], + "Hash": "c35768291560ce302c0a6589f92e837d" + }, + "callr": { + "Package": "callr", + "Version": "3.7.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "processx", + "utils" + ], + "Hash": "9b2191ede20fa29828139b9900922e51" + }, + "cellranger": { + "Package": "cellranger", + "Version": "1.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "rematch", + "tibble" + ], + "Hash": "f61dbaec772ccd2e17705c1e872e9e7c" + }, + "checkmate": { + "Package": "checkmate", + "Version": "2.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "backports", + "utils" + ], + "Hash": "c01cab1cb0f9125211a6fc99d540e315" + }, + "cli": { + "Package": "cli", + "Version": "3.6.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "1216ac65ac55ec0058a6f75d7ca0fd52" + }, + "clipr": { + "Package": "clipr", + "Version": "0.8.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "3f038e5ac7f41d4ac41ce658c85e3042" + }, + "coda": { + "Package": "coda", + "Version": "0.19-4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "lattice" + ], + "Hash": "24b6d006b8b2343876cf230687546932" + }, + "colorspace": { + "Package": "colorspace", + "Version": "2.1-0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "methods", + "stats" + ], + "Hash": "f20c47fd52fae58b4e377c37bb8c335b" + }, + "conflicted": { + "Package": "conflicted", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "memoise", + "rlang" + ], + "Hash": "bb097fccb22d156624fd07cd2894ddb6" + }, + "cpp11": { + "Package": "cpp11", + "Version": "0.4.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "5a295d7d963cc5035284dcdbaf334f4e" + }, + "crayon": { + "Package": "crayon", + "Version": "1.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grDevices", + "methods", + "utils" + ], + "Hash": "e8a1e41acf02548751f45c718d55aa6a" + }, + "curl": { + "Package": "curl", + "Version": "5.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "ce88d13c0b10fe88a37d9c59dba2d7f9" + }, + "data.table": { + "Package": "data.table", + "Version": "1.14.10", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "6ea17a32294d8ca00455825ab0cf71b9" + }, + "data.tree": { + "Package": "data.tree", + "Version": "1.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "methods", + "stringi" + ], + "Hash": "d7602f0f55e0335b83f2353337848d6f" + }, + "datawizard": { + "Package": "datawizard", + "Version": "0.9.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "insight", + "stats", + "utils" + ], + "Hash": "51cf8172b52cfa5b4b988c73c37accfa" + }, + "dbplyr": { + "Package": "dbplyr", + "Version": "2.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "DBI", + "R", + "R6", + "blob", + "cli", + "dplyr", + "glue", + "lifecycle", + "magrittr", + "methods", + "pillar", + "purrr", + "rlang", + "tibble", + "tidyr", + "tidyselect", + "utils", + "vctrs", + "withr" + ], + "Hash": "59351f28a81f0742720b85363c4fdd61" + }, + "digest": { + "Package": "digest", + "Version": "0.6.34", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "7ede2ee9ea8d3edbf1ca84c1e333ad1a" + }, + "downloader": { + "Package": "downloader", + "Version": "0.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "digest", + "utils" + ], + "Hash": "f4f2a915e0dedbdf016a83b63477349f" + }, + "dplyr": { + "Package": "dplyr", + "Version": "1.1.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "generics", + "glue", + "lifecycle", + "magrittr", + "methods", + "pillar", + "rlang", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "fedd9d00c2944ff00a0e2696ccf048ec" + }, + "dtplyr": { + "Package": "dtplyr", + "Version": "1.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "data.table", + "dplyr", + "glue", + "lifecycle", + "rlang", + "tibble", + "tidyselect", + "vctrs" + ], + "Hash": "54ed3ea01b11e81a86544faaecfef8e2" + }, + "ellipsis": { + "Package": "ellipsis", + "Version": "0.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "rlang" + ], + "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077" + }, + "ergm": { + "Package": "ergm", + "Version": "4.6.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "MASS", + "Matrix", + "R", + "Rdpack", + "coda", + "knitr", + "lpSolveAPI", + "magrittr", + "memoise", + "methods", + "network", + "parallel", + "purrr", + "rlang", + "rle", + "robustbase", + "statnet.common", + "stringr", + "tibble", + "trust" + ], + "Hash": "aee1ba632c48b2e4004302a800c301dc" + }, + "ergm.count": { + "Package": "ergm.count", + "Version": "4.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "ergm", + "network", + "statnet.common" + ], + "Hash": "099b8f6e4b68dd554ca9c1f133ea8492" + }, + "ergm.multi": { + "Package": "ergm.multi", + "Version": "0.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "Matrix", + "R", + "Rdpack", + "ergm", + "glue", + "methods", + "network", + "parallel", + "purrr", + "rlang", + "rle", + "statnet.common", + "tibble" + ], + "Hash": "7a2bb59a3918ff77d122e83e6eaa8943" + }, + "evaluate": { + "Package": "evaluate", + "Version": "0.23", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "daf4a1246be12c1fa8c7705a0935c1a0" + }, + "fansi": { + "Package": "fansi", + "Version": "1.0.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "utils" + ], + "Hash": "962174cf2aeb5b9eea581522286a911f" + }, + "farver": { + "Package": "farver", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "8106d78941f34855c440ddb946b8f7a5" + }, + "fastmap": { + "Package": "fastmap", + "Version": "1.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "f7736a18de97dea803bde0a2daaafb27" + }, + "fontawesome": { + "Package": "fontawesome", + "Version": "0.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "htmltools", + "rlang" + ], + "Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d" + }, + "forcats": { + "Package": "forcats", + "Version": "1.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "magrittr", + "rlang", + "tibble" + ], + "Hash": "1a0a9a3d5083d0d573c4214576f1e690" + }, + "fs": { + "Package": "fs", + "Version": "1.6.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "47b5f30c720c23999b913a1a635cf0bb" + }, + "gargle": { + "Package": "gargle", + "Version": "1.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "fs", + "glue", + "httr", + "jsonlite", + "lifecycle", + "openssl", + "rappdirs", + "rlang", + "stats", + "utils", + "withr" + ], + "Hash": "fc0b272e5847c58cd5da9b20eedbd026" + }, + "generics": { + "Package": "generics", + "Version": "0.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "15e9634c0fcd294799e9b2e929ed1b86" + }, + "ggplot2": { + "Package": "ggplot2", + "Version": "3.4.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "MASS", + "R", + "cli", + "glue", + "grDevices", + "grid", + "gtable", + "isoband", + "lifecycle", + "mgcv", + "rlang", + "scales", + "stats", + "tibble", + "vctrs", + "withr" + ], + "Hash": "313d31eff2274ecf4c1d3581db7241f9" + }, + "ggsurvfit": { + "Package": "ggsurvfit", + "Version": "1.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "broom", + "cli", + "dplyr", + "ggplot2", + "glue", + "gtable", + "patchwork", + "rlang", + "survival", + "tidyr" + ], + "Hash": "42d3b3206360e4fb840a7c9311b975cc" + }, + "glue": { + "Package": "glue", + "Version": "1.7.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "e0b3a53876554bd45879e596cdb10a52" + }, + "googledrive": { + "Package": "googledrive", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "gargle", + "glue", + "httr", + "jsonlite", + "lifecycle", + "magrittr", + "pillar", + "purrr", + "rlang", + "tibble", + "utils", + "uuid", + "vctrs", + "withr" + ], + "Hash": "e99641edef03e2a5e87f0a0b1fcc97f4" + }, + "googlesheets4": { + "Package": "googlesheets4", + "Version": "1.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cellranger", + "cli", + "curl", + "gargle", + "glue", + "googledrive", + "httr", + "ids", + "lifecycle", + "magrittr", + "methods", + "purrr", + "rematch2", + "rlang", + "tibble", + "utils", + "vctrs", + "withr" + ], + "Hash": "d6db1667059d027da730decdc214b959" + }, + "gridExtra": { + "Package": "gridExtra", + "Version": "2.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grDevices", + "graphics", + "grid", + "gtable", + "utils" + ], + "Hash": "7d7f283939f563670a697165b2cf5560" + }, + "gtable": { + "Package": "gtable", + "Version": "0.3.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "grid", + "lifecycle", + "rlang" + ], + "Hash": "b29cf3031f49b04ab9c852c912547eef" + }, + "haven": { + "Package": "haven", + "Version": "2.5.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "cpp11", + "forcats", + "hms", + "lifecycle", + "methods", + "readr", + "rlang", + "tibble", + "tidyselect", + "vctrs" + ], + "Hash": "9171f898db9d9c4c1b2c745adc2c1ef1" + }, + "here": { + "Package": "here", + "Version": "1.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "rprojroot" + ], + "Hash": "24b224366f9c2e7534d2344d10d59211" + }, + "highr": { + "Package": "highr", + "Version": "0.10", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "xfun" + ], + "Hash": "06230136b2d2b9ba5805e1963fa6e890" + }, + "hms": { + "Package": "hms", + "Version": "1.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "lifecycle", + "methods", + "pkgconfig", + "rlang", + "vctrs" + ], + "Hash": "b59377caa7ed00fa41808342002138f9" + }, + "htmltools": { + "Package": "htmltools", + "Version": "0.5.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "base64enc", + "digest", + "ellipsis", + "fastmap", + "grDevices", + "rlang", + "utils" + ], + "Hash": "2d7b3857980e0e0d0a1fd6f11928ab0f" + }, + "htmlwidgets": { + "Package": "htmlwidgets", + "Version": "1.6.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grDevices", + "htmltools", + "jsonlite", + "knitr", + "rmarkdown", + "yaml" + ], + "Hash": "04291cc45198225444a397606810ac37" + }, + "httr": { + "Package": "httr", + "Version": "1.4.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "curl", + "jsonlite", + "mime", + "openssl" + ], + "Hash": "ac107251d9d9fd72f0ca8049988f1d7f" + }, + "ids": { + "Package": "ids", + "Version": "1.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "openssl", + "uuid" + ], + "Hash": "99df65cfef20e525ed38c3d2577f7190" + }, + "igraph": { + "Package": "igraph", + "Version": "2.0.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "Matrix", + "R", + "cli", + "cpp11", + "grDevices", + "graphics", + "lifecycle", + "magrittr", + "methods", + "pkgconfig", + "rlang", + "stats", + "utils" + ], + "Hash": "fb2999614d40fe7fd61cf569b66a2dbc" + }, + "insight": { + "Package": "insight", + "Version": "0.19.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods", + "stats", + "utils" + ], + "Hash": "750aba9b42391da33ac290b71a749023" + }, + "isoband": { + "Package": "isoband", + "Version": "0.2.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grid", + "utils" + ], + "Hash": "0080607b4a1a7b28979aecef976d8bc2" + }, + "jquerylib": { + "Package": "jquerylib", + "Version": "0.1.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "htmltools" + ], + "Hash": "5aab57a3bd297eee1c1d862735972182" + }, + "jsonlite": { + "Package": "jsonlite", + "Version": "1.8.8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods" + ], + "Hash": "e1b9c55281c5adc4dd113652d9e26768" + }, + "kableExtra": { + "Package": "kableExtra", + "Version": "1.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "digest", + "grDevices", + "graphics", + "htmltools", + "knitr", + "magrittr", + "rmarkdown", + "rstudioapi", + "scales", + "stats", + "stringr", + "svglite", + "tools", + "viridisLite", + "xml2" + ], + "Hash": "532d16304274c23c8563f94b79351c86" + }, + "knitr": { + "Package": "knitr", + "Version": "1.45", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "evaluate", + "highr", + "methods", + "tools", + "xfun", + "yaml" + ], + "Hash": "1ec462871063897135c1bcbe0fc8f07d" + }, + "labeling": { + "Package": "labeling", + "Version": "0.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "graphics", + "stats" + ], + "Hash": "b64ec208ac5bc1852b285f665d6368b3" + }, + "lattice": { + "Package": "lattice", + "Version": "0.21-9", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "grid", + "stats", + "utils" + ], + "Hash": "5558c61e0136e247252f5f952cdaad6a" + }, + "lifecycle": { + "Package": "lifecycle", + "Version": "1.0.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "rlang" + ], + "Hash": "b8552d117e1b808b09a832f589b79035" + }, + "lpSolveAPI": { + "Package": "lpSolveAPI", + "Version": "5.5.2.0-17.11", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "b062307fdfd15573643dbcb08948178c" + }, + "lubridate": { + "Package": "lubridate", + "Version": "1.9.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "generics", + "methods", + "timechange" + ], + "Hash": "680ad542fbcf801442c83a6ac5a2126c" + }, + "magrittr": { + "Package": "magrittr", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "7ce2733a9826b3aeb1775d56fd305472" + }, + "memoise": { + "Package": "memoise", + "Version": "2.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cachem", + "rlang" + ], + "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" + }, + "mgcv": { + "Package": "mgcv", + "Version": "1.9-0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "Matrix", + "R", + "graphics", + "methods", + "nlme", + "splines", + "stats", + "utils" + ], + "Hash": "086028ca0460d0c368028d3bda58f31b" + }, + "mime": { + "Package": "mime", + "Version": "0.12", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "tools" + ], + "Hash": "18e9c28c1d3ca1560ce30658b22ce104" + }, + "modelr": { + "Package": "modelr", + "Version": "0.1.11", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "broom", + "magrittr", + "purrr", + "rlang", + "tibble", + "tidyr", + "tidyselect", + "vctrs" + ], + "Hash": "4f50122dc256b1b6996a4703fecea821" + }, + "modelsummary": { + "Package": "modelsummary", + "Version": "1.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "checkmate", + "data.table", + "generics", + "glue", + "insight", + "kableExtra", + "parameters", + "performance", + "tables" + ], + "Hash": "ab3f79e32ad9ea51af4f20d0c43ca67e" + }, + "munsell": { + "Package": "munsell", + "Version": "0.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "colorspace", + "methods" + ], + "Hash": "6dfe8bf774944bd5595785e3229d8771" + }, + "network": { + "Package": "network", + "Version": "1.18.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "magrittr", + "statnet.common", + "stats", + "tibble", + "utils" + ], + "Hash": "5e4fda9d3ed359d1b155d46a36681191" + }, + "networkDynamic": { + "Package": "networkDynamic", + "Version": "0.11.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods", + "network", + "networkLite", + "statnet.common" + ], + "Hash": "d7c6e847c2349ed9b8ca02fe2a04417d" + }, + "networkLite": { + "Package": "networkLite", + "Version": "1.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "dplyr", + "network", + "statnet.common", + "tibble" + ], + "Hash": "76b24ec935f6557644870eda3c0c24df" + }, + "nlme": { + "Package": "nlme", + "Version": "3.1-163", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "graphics", + "lattice", + "stats", + "utils" + ], + "Hash": "8d1938040a05566f4f7a14af4feadd6b" + }, + "openssl": { + "Package": "openssl", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "askpass" + ], + "Hash": "2a0dc8c6adfb6f032e4d4af82d258ab5" + }, + "parameters": { + "Package": "parameters", + "Version": "0.21.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bayestestR", + "datawizard", + "graphics", + "insight", + "methods", + "stats", + "utils" + ], + "Hash": "d6b15d1e41faf8951b59f5b3051ad3e3" + }, + "patchwork": { + "Package": "patchwork", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli", + "ggplot2", + "grDevices", + "graphics", + "grid", + "gtable", + "rlang", + "stats", + "utils" + ], + "Hash": "9c8ab14c00ac07e9e04d1664c0b74486" + }, + "performance": { + "Package": "performance", + "Version": "0.10.8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bayestestR", + "datawizard", + "insight", + "methods", + "stats", + "utils" + ], + "Hash": "92873fb57cc5b73fe2aa0b09056a789a" + }, + "pillar": { + "Package": "pillar", + "Version": "1.9.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli", + "fansi", + "glue", + "lifecycle", + "rlang", + "utf8", + "utils", + "vctrs" + ], + "Hash": "15da5a8412f317beeee6175fbc76f4bb" + }, + "pkgconfig": { + "Package": "pkgconfig", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "01f28d4278f15c76cddbea05899c5d6f" + }, + "png": { + "Package": "png", + "Version": "0.1-8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "bd54ba8a0a5faded999a7aab6e46b374" + }, + "prettyunits": { + "Package": "prettyunits", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" + }, + "processx": { + "Package": "processx", + "Version": "3.8.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "ps", + "utils" + ], + "Hash": "82d48b1aec56084d9438dbf98087a7e9" + }, + "progress": { + "Package": "progress", + "Version": "1.2.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "crayon", + "hms", + "prettyunits" + ], + "Hash": "f4625e061cb2865f111b47ff163a5ca6" + }, + "ps": { + "Package": "ps", + "Version": "1.7.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "dd2b9319ee0656c8acf45c7f40c59de7" + }, + "purrr": { + "Package": "purrr", + "Version": "1.0.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "lifecycle", + "magrittr", + "rlang", + "vctrs" + ], + "Hash": "1cba04a4e9414bdefc9dcaa99649a8dc" + }, + "ragg": { + "Package": "ragg", + "Version": "1.2.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "systemfonts", + "textshaping" + ], + "Hash": "90a1b8b7e518d7f90480d56453b4d062" + }, + "randomForestSRC": { + "Package": "randomForestSRC", + "Version": "3.2.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "DiagrammeR", + "R", + "data.tree", + "parallel" + ], + "Hash": "8d427133fc7f8e54bbc1c96ba203d2c5" + }, + "rappdirs": { + "Package": "rappdirs", + "Version": "0.3.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "5e3c5dc0b071b21fa128676560dbe94d" + }, + "rbibutils": { + "Package": "rbibutils", + "Version": "2.2.16", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "tools", + "utils" + ], + "Hash": "8c06968e0a5b0209c5f34239b1302336" + }, + "readr": { + "Package": "readr", + "Version": "2.1.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "clipr", + "cpp11", + "crayon", + "hms", + "lifecycle", + "methods", + "rlang", + "tibble", + "tzdb", + "utils", + "vroom" + ], + "Hash": "9de96463d2117f6ac49980577939dfb3" + }, + "readxl": { + "Package": "readxl", + "Version": "1.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cellranger", + "cpp11", + "progress", + "tibble", + "utils" + ], + "Hash": "8cf9c239b96df1bbb133b74aef77ad0a" + }, + "rematch": { + "Package": "rematch", + "Version": "2.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "cbff1b666c6fa6d21202f07e2318d4f1" + }, + "rematch2": { + "Package": "rematch2", + "Version": "2.1.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "tibble" + ], + "Hash": "76c9e04c712a05848ae7a23d2f170a40" + }, "renv": { "Package": "renv", "Version": "1.0.3", @@ -23,6 +1600,662 @@ "utils" ], "Hash": "41b847654f567341725473431dd0d5ab" + }, + "reprex": { + "Package": "reprex", + "Version": "2.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "callr", + "cli", + "clipr", + "fs", + "glue", + "knitr", + "lifecycle", + "rlang", + "rmarkdown", + "rstudioapi", + "utils", + "withr" + ], + "Hash": "1425f91b4d5d9a8f25352c44a3d914ed" + }, + "reticulate": { + "Package": "reticulate", + "Version": "1.34.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "Matrix", + "R", + "Rcpp", + "RcppTOML", + "graphics", + "here", + "jsonlite", + "methods", + "png", + "rappdirs", + "rlang", + "utils", + "withr" + ], + "Hash": "a69f815bcba8a055de0b08339b943f9e" + }, + "rlang": { + "Package": "rlang", + "Version": "1.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "42548638fae05fd9a9b5f3f437fbbbe2" + }, + "rle": { + "Package": "rle", + "Version": "0.9.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "f84d8f430c496bb5c6769fed95705562" + }, + "rmarkdown": { + "Package": "rmarkdown", + "Version": "2.25", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bslib", + "evaluate", + "fontawesome", + "htmltools", + "jquerylib", + "jsonlite", + "knitr", + "methods", + "stringr", + "tinytex", + "tools", + "utils", + "xfun", + "yaml" + ], + "Hash": "d65e35823c817f09f4de424fcdfa812a" + }, + "robustbase": { + "Package": "robustbase", + "Version": "0.99-2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "DEoptimR", + "R", + "graphics", + "methods", + "stats", + "utils" + ], + "Hash": "bae2e53c94459ff147aef478eac6ee94" + }, + "rprojroot": { + "Package": "rprojroot", + "Version": "2.0.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "4c8415e0ec1e29f3f4f6fc108bef0144" + }, + "rstudioapi": { + "Package": "rstudioapi", + "Version": "0.15.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "5564500e25cffad9e22244ced1379887" + }, + "rvest": { + "Package": "rvest", + "Version": "1.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "httr", + "lifecycle", + "magrittr", + "rlang", + "selectr", + "tibble", + "withr", + "xml2" + ], + "Hash": "a4a5ac819a467808c60e36e92ddf195e" + }, + "sass": { + "Package": "sass", + "Version": "0.4.8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R6", + "fs", + "htmltools", + "rappdirs", + "rlang" + ], + "Hash": "168f9353c76d4c4b0a0bbf72e2c2d035" + }, + "scales": { + "Package": "scales", + "Version": "1.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "RColorBrewer", + "cli", + "farver", + "glue", + "labeling", + "lifecycle", + "munsell", + "rlang", + "viridisLite" + ], + "Hash": "c19df082ba346b0ffa6f833e92de34d1" + }, + "selectr": { + "Package": "selectr", + "Version": "0.4-2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "methods", + "stringr" + ], + "Hash": "3838071b66e0c566d55cc26bd6e27bf4" + }, + "sna": { + "Package": "sna", + "Version": "2.7-2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "network", + "statnet.common", + "utils" + ], + "Hash": "050b4098cef7fa1827c5c199559fde1f" + }, + "statnet": { + "Package": "statnet", + "Version": "2019.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "ergm", + "ergm.count", + "network", + "networkDynamic", + "sna", + "statnet.common", + "tergm", + "tsna" + ], + "Hash": "29f1ce50eb7d1294caafef2c07ee3b66" + }, + "statnet.common": { + "Package": "statnet.common", + "Version": "4.9.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "coda", + "methods", + "parallel", + "tools", + "utils" + ], + "Hash": "be35aebf512f7b31de12200d5c3d1d67" + }, + "stringi": { + "Package": "stringi", + "Version": "1.8.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "stats", + "tools", + "utils" + ], + "Hash": "058aebddea264f4c99401515182e656a" + }, + "stringr": { + "Package": "stringr", + "Version": "1.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "magrittr", + "rlang", + "stringi", + "vctrs" + ], + "Hash": "960e2ae9e09656611e0b8214ad543207" + }, + "survival": { + "Package": "survival", + "Version": "3.5-7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "Matrix", + "R", + "graphics", + "methods", + "splines", + "stats", + "utils" + ], + "Hash": "b8e943d262c3da0b0febd3e04517c197" + }, + "svglite": { + "Package": "svglite", + "Version": "2.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11", + "systemfonts" + ], + "Hash": "124a41fdfa23e8691cb744c762f10516" + }, + "sys": { + "Package": "sys", + "Version": "3.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "3a1be13d68d47a8cd0bfd74739ca1555" + }, + "systemfonts": { + "Package": "systemfonts", + "Version": "1.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "15b594369e70b975ba9f064295983499" + }, + "tables": { + "Package": "tables", + "Version": "0.9.17", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "htmltools", + "knitr", + "stats", + "utils" + ], + "Hash": "22af1e94a64cf8713c4f79362eeb0fd6" + }, + "tergm": { + "Package": "tergm", + "Version": "4.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "MASS", + "coda", + "ergm", + "ergm.multi", + "methods", + "network", + "networkDynamic", + "nlme", + "purrr", + "robustbase", + "statnet.common", + "utils" + ], + "Hash": "49f1958da2a787ab5dfc833676a0b450" + }, + "textshaping": { + "Package": "textshaping", + "Version": "0.3.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11", + "systemfonts" + ], + "Hash": "997aac9ad649e0ef3b97f96cddd5622b" + }, + "tibble": { + "Package": "tibble", + "Version": "3.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "fansi", + "lifecycle", + "magrittr", + "methods", + "pillar", + "pkgconfig", + "rlang", + "utils", + "vctrs" + ], + "Hash": "a84e2cc86d07289b3b6f5069df7a004c" + }, + "tidyr": { + "Package": "tidyr", + "Version": "1.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "cpp11", + "dplyr", + "glue", + "lifecycle", + "magrittr", + "purrr", + "rlang", + "stringr", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "915fb7ce036c22a6a33b5a8adb712eb1" + }, + "tidyselect": { + "Package": "tidyselect", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang", + "vctrs", + "withr" + ], + "Hash": "79540e5fcd9e0435af547d885f184fd5" + }, + "tidyverse": { + "Package": "tidyverse", + "Version": "2.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "broom", + "cli", + "conflicted", + "dbplyr", + "dplyr", + "dtplyr", + "forcats", + "ggplot2", + "googledrive", + "googlesheets4", + "haven", + "hms", + "httr", + "jsonlite", + "lubridate", + "magrittr", + "modelr", + "pillar", + "purrr", + "ragg", + "readr", + "readxl", + "reprex", + "rlang", + "rstudioapi", + "rvest", + "stringr", + "tibble", + "tidyr", + "xml2" + ], + "Hash": "c328568cd14ea89a83bd4ca7f54ae07e" + }, + "timechange": { + "Package": "timechange", + "Version": "0.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "c5f3c201b931cd6474d17d8700ccb1c8" + }, + "tinytex": { + "Package": "tinytex", + "Version": "0.49", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "xfun" + ], + "Hash": "5ac22900ae0f386e54f1c307eca7d843" + }, + "trust": { + "Package": "trust", + "Version": "0.1-8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "stats" + ], + "Hash": "f50614d2145ba1012b62ff75f2129d5b" + }, + "tsna": { + "Package": "tsna", + "Version": "0.3.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "network", + "networkDynamic", + "statnet.common" + ], + "Hash": "592e0f1e84df929ad3560e86a0dce04b" + }, + "tzdb": { + "Package": "tzdb", + "Version": "0.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "f561504ec2897f4d46f0c7657e488ae1" + }, + "utf8": { + "Package": "utf8", + "Version": "1.2.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "62b65c52671e6665f803ff02954446e9" + }, + "uuid": { + "Package": "uuid", + "Version": "1.2-0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "303c19bfd970bece872f93a824e323d9" + }, + "vctrs": { + "Package": "vctrs", + "Version": "0.6.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang" + ], + "Hash": "c03fa420630029418f7e6da3667aac4a" + }, + "viridis": { + "Package": "viridis", + "Version": "0.6.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "ggplot2", + "gridExtra", + "viridisLite" + ], + "Hash": "acd96d9fa70adeea4a5a1150609b9745" + }, + "viridisLite": { + "Package": "viridisLite", + "Version": "0.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "c826c7c4241b6fc89ff55aaea3fa7491" + }, + "visNetwork": { + "Package": "visNetwork", + "Version": "2.1.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "htmltools", + "htmlwidgets", + "jsonlite", + "magrittr", + "methods", + "stats", + "utils" + ], + "Hash": "3e48b097e8d9a91ecced2ed4817a678d" + }, + "vroom": { + "Package": "vroom", + "Version": "1.6.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bit64", + "cli", + "cpp11", + "crayon", + "glue", + "hms", + "lifecycle", + "methods", + "progress", + "rlang", + "stats", + "tibble", + "tidyselect", + "tzdb", + "vctrs", + "withr" + ], + "Hash": "390f9315bc0025be03012054103d227c" + }, + "withr": { + "Package": "withr", + "Version": "3.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics" + ], + "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35" + }, + "xfun": { + "Package": "xfun", + "Version": "0.41", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "stats", + "tools" + ], + "Hash": "460a5e0fe46a80ef87424ad216028014" + }, + "xml2": { + "Package": "xml2", + "Version": "1.3.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "methods", + "rlang" + ], + "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61" + }, + "yaml": { + "Package": "yaml", + "Version": "2.3.8", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "29240487a071f535f5e5d5a323b7afbd" } } } diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3c98206 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,32 @@ +appnope==0.1.3 +asttokens==2.4.1 +comm==0.2.1 +debugpy==1.8.0 +decorator==5.1.1 +executing==2.0.1 +ipykernel==6.29.0 +ipython==8.20.0 +jedi==0.19.1 +jupyter_client==8.6.0 +jupyter_core==5.7.1 +matplotlib-inline==0.1.6 +nest-asyncio==1.6.0 +packaging==23.2 +parso==0.8.3 +pexpect==4.9.0 +platformdirs==4.1.0 +polars==0.20.6 +prompt-toolkit==3.0.43 +psutil==5.9.8 +ptyprocess==0.7.0 +pure-eval==0.2.2 +Pygments==2.17.2 +python-dateutil==2.8.2 +pyzmq==25.1.2 +setuptools==69.0.3 +six==1.16.0 +stack-data==0.6.3 +tornado==6.4 +traitlets==5.14.1 +wcwidth==0.2.13 +wheel==0.42.0