# 产物写到 ../csv/gwas_manhattan.csv —— 脚本和 CSV 是 content/tessera/data/ 下固定的兄弟目录,
# 所以按脚本自身定位,不依赖你在哪个目录敲这条命令。csv/ 不进仓库(见 .gitignore)。
#
# Rscript 时路径在 --file= 里,source() 时在 sys.frame()$ofile 里,两种都要认:
# 只取其中一种的话,另一种跑法会静默地把 CSV 写到当前目录去。
script_dir <- local({
arg <- grep("^--file=", commandArgs(trailingOnly = FALSE), value = TRUE)
path <- if (length(arg)) sub("^--file=", "", arg[[1L]]) else sys.frame(1)$ofile
dirname(normalizePath(path, mustWork = TRUE))
})
out_csv <- file.path(script_dir, "..", "csv", "gwas_manhattan.csv")
dir.create(dirname(out_csv), recursive = TRUE, showWarnings = FALSE)
set.seed(2026)
n_chr <- 12
markers_per_chr <- 500
gwas_manhattan <- do.call(rbind, lapply(seq_len(n_chr), function(chr) {
data.frame(
Marker = paste0("rs", chr, "_", seq_len(markers_per_chr)),
Chr = chr,
Pos = sort(sample(seq(1, 100000000), markers_per_chr)),
P = runif(markers_per_chr, min = 1e-4, max = 1),
stringsAsFactors = FALSE
)
}))
signals <- c(
rs3_115 = 8.82, rs3_166 = 8.91,
rs7_8 = 9.32, rs7_41 = 9.04, rs7_238 = 9.25,
rs8_355 = 7.82, rs10_177 = 7.12, rs12_500 = 8.92,
rs4_321 = 6.62, rs5_118 = 6.08, rs5_383 = 6.38,
rs6_207 = 7.58, rs6_365 = 7.31, rs7_407 = 6.34,
rs9_177 = 7.67, rs9_389 = 7.36, rs11_143 = 7.18, rs12_85 = 7.32
)
signal_rows <- match(names(signals), gwas_manhattan$Marker)
stopifnot(!anyNA(signal_rows))
gwas_manhattan$P[signal_rows] <- 10^(-unname(signals))
write.csv(gwas_manhattan, out_csv, row.names = FALSE)