R语言在生物学中运用的比较多的还是吊包然后使用内置函数进行一次性工作,但是生物信息与计算生物学领域确实低估和忽视了R语言在循环和自定义函数方面的优势。
在R语言中,function
是一个核心概念,它允许用户创建可重用的代码块来执行特定的任务。函数是一段组织好的,可重复使用的,用来实现单一,或相关联功能的代码片段。它们可以接受输入参数,并返回一个或多个输出值。
目录
函数的基本结构:
- 函数名:用于标识函数的名称。
- 参数列表:括号内的变量,用于接收传递给函数的值。
- 函数体:大括号内的代码块,定义了函数执行的操作。
- 返回值:函数执行完毕后返回的结果,通常是函数体中的最后一个表达式的结果。
R
function_name <- function(arg_1, arg_2, ...) {
# 函数体
# 执行的代码块
return(output)
}
其中:
function_name
是函数的名称。arg_1, arg_2, ...
是函数的形式参数列表。return(output)
用于指定函数的返回值。
例1:简单自定义函数
(1)两个参数加法:
我们尝试自己写一个加法函数,实现将两个数相加。
R
addFunction <- function(x,y){
addResult <- x + y
return(addResult)
}
addFunction(1,5)
(2)多参数运算
R
fixFunction <- function(a,x,y,z) {
fixResult <- x^2 + y*z -a
return(fixResult)
}
a <- 10
x <- 5
y <- 8
z <- 4
fixFunction(a,x,y,z)
例2:带有内循环的函数定义
往往复杂函数的运算需要内置循环,这个方式其实和java很像
(1)计算偶数累计和
R
# 定义一个自定义函数,该函数接收一个数值向量,并计算所有偶数的累积和
sum_even_numbers <- function(nums) {
sum_even <- 0 # 初始化偶数累积和为0
for (num in nums) {
if (num %% 2 == 0) { # 检查数字是否为偶数
sum_even <- sum_even + num # 如果是偶数,则加到累积和中
}
}
return(sum_even) # 返回偶数累积和
}
# 创建一个数值向量
numbers <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# 调用自定义函数
result <- sum_even_numbers(numbers)
# 打印结果
print(result)
(2)更为复杂的例子
R
# 定义一个更复杂的函数
complex_function_v2 <- function(numbers, threshold) {
# 初始化结果向量
result <- numeric(length(numbers))
# 遍历输入向量的每个元素
for (i in seq_along(numbers)) {
# 计算当前元素的累积乘积
prod_value <- prod(numbers[1:i])
# 计算从1到当前元素值的累加和
sum_value <- sum(1:numbers[i])
# 应用条件判断
if (numbers[i] > threshold) {
# 如果当前元素值大于阈值,则加上一个特定的值(例如10)
adjustment <- 10
} else {
# 否则不加调整
adjustment <- 0
}
# 将计算结果和调整值结合起来,并存储在结果向量中
result[i] <- prod_value * sum_value + adjustment
}
# 返回结果向量
return(result)
}
# 测试函数
numbers <- c(1, 2, 3, 4, 5)
threshold <- 3
result <- complex_function_v2(numbers, threshold)
print(result)
基因表达数据集成函数
在生物信息学中,我们经常需要处理基因表达数据,这可能包括标准化数据、识别差异表达基因、进行聚类分析等。以下是一个复杂的R函数示例,它模拟了处理基因表达数据的过程:
R
# 定义一个处理基因表达数据的复杂函数
process_gene_expression <- function(expression_matrix, group_labels, p_value_threshold) {
# 标准化基因表达数据
standardized_data <- scale(expression_matrix)
# 差异表达分析
library(limma)
design_matrix <- model.matrix(~ factor(group_labels))
fit <- lmFit(standardized_data, design_matrix)
contrast_matrix <- makeContrasts(factor(group_labels)[2] - factor(group_labels)[1], levels = design_matrix)
fit2 <- contrasts.fit(fit, contrast_matrix)
fit2 <- eBayes(fit2)
de_genes <- topTable(fit2, coef = 1, number = Inf, sort.by = "B", adjust.method = "BH")
# 聚类分析
library(gplots)
hc <- hclust(dist(t(standardized_data)), method = "complete")
row_order <- order.dendrogram(as.dendrogram(hc))
col_order <- order.dendrogram(as.dendrogram(hclust(dist(expression_matrix))))
heatmap.2(as.matrix(standardized_data[row_order, col_order]),
trace = "none",
key = TRUE,
density.info = "none",
labRow = FALSE,
labCol = FALSE,
dendrogram = "both",
scale = "none",
col = bluered(75))
# 识别显著差异表达基因
significant_genes <- rownames(de_genes[de_genes$P.Value < p_value_threshold, ])
# 创建报告
report <- list(
standardized_data = standardized_data,
de_genes = de_genes,
significant_genes = significant_genes
)
# 返回报告
return(report)
}
# 测试函数
# 假设expression_matrix是一个基因表达矩阵,group_labels是样本分组标签
# p_value_threshold是设定的p值阈值
# expression_matrix <- ... # 填充基因表达矩阵
# group_labels <- ... # 填充样本分组标签
# p_value_threshold <- ... # 设定p值阈值
# 处理基因表达数据
# report <- process_gene_expression(expression_matrix, group_labels, p_value_threshold)
# 打印报告
# print(report$standardized_data)
# print(report$de_genes)
# print(report$significant_genes)