R语言function快速掌握-自定义函数

R语言在生物学中运用的比较多的还是吊包然后使用内置函数进行一次性工作,但是生物信息与计算生物学领域确实低估和忽视了R语言在循环和自定义函数方面的优势。

在R语言中,function 是一个核心概念,它允许用户创建可重用的代码块来执行特定的任务。函数是一段组织好的,可重复使用的,用来实现单一,或相关联功能的代码片段。它们可以接受输入参数,并返回一个或多个输出值。


目录

函数的基本结构:

例1:简单自定义函数

(1)两个参数加法:

(2)多参数运算

例2:带有内循环的函数定义

(1)计算偶数累计和

(2)更为复杂的例子

基因表达数据集成函数


函数的基本结构:

  • 函数名:用于标识函数的名称。
  • 参数列表:括号内的变量,用于接收传递给函数的值。
  • 函数体:大括号内的代码块,定义了函数执行的操作。
  • 返回值:函数执行完毕后返回的结果,通常是函数体中的最后一个表达式的结果。
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)
相关推荐
Ajiang28247353041 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
幽兰的天空1 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----6 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024066 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it6 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神7 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海7 小时前
scala String
大数据·开发语言·scala