R语言apply函数传多参数报错及添加输出变量保存绘图问题问询
报错原因解析
- 第一个维度错误:
apply(df, 1, f)按行遍历数据框时,每次传入函数f的参数x是当前行转换的一维向量,并非原始二维数据框,使用x[arg1, 1]这种二维索引语法自然不生效,且调用时没有给f传入arg1参数,参数自然无法传递。 - 第二个FUN缺失错误:
apply的固定参数顺序为apply(X, MARGIN, FUN, ...),第二个位置必须传入指定遍历维度的MARGIN参数,你写apply(df, arg1=1, f)相当于跳过了MARGIN参数直接传自定义参数,系统无法识别到f是要执行的函数,因此报错。
正确实现方案
你需要对每一行做运算的场景下,apply按行传入的x已经是当前行的内容,不需要额外传行号参数。如果要新增output参数保存绘图,直接在函数定义中添加即可,apply的...位支持传入自定义函数的额外参数,示例代码如下:
col_1 <- c("A", "B", "C") col_2 <- c("red", "blue", "black") df <- data.frame(col_1, col_2) # 定义函数,新增output参数,默认设为NULL避免未传参时报错 f <- function(x, output = NULL) { # 取当前行第一、第二个元素,对应你需要的"A"、"red"等输出 row_res <- c(x[1], x[2]) # 传入output路径时执行绘图保存逻辑 if (!is.null(output)) { # 替换为你的实际绘图代码 png(file.path(output, paste0(row_res[1], ".png"))) plot(1:10, main = paste0(row_res[1], "-", row_res[2])) dev.off() } return(row_res) } # 正确调用apply:MARGIN=1放第二个位置,后面跟自定义参数 # 输出结果的每一列对应数据框一行的两个元素,第一列就是你要的"A"和"red" result <- apply(df, MARGIN = 1, FUN = f, output = "./output_dir/")
额外说明
如果你确实需要在函数内获取当前行的行号,可以直接用seq(nrow(df))遍历,比apply更方便控制行号参数:
result <- lapply(seq(nrow(df)), function(arg1) { f(x = df, arg1 = arg1, output = "./output_dir/") })
内容的提问来源于stack exchange,提问作者Yulia Kentieva
相关产品推荐
相关产品推荐

