我试图在应用函数的有趣参数中传递用户定义函数的2个参数,如下例所示:
mat <- matrix(NA, nrow =10, ncol=3)
mat[,1] <- runif(10, 0, 1)
mat[,2] <- runif(10, 0, 1)
mat[,3] <- runif(10, 0, 1)
roundFn <- function(indata, p){
for (i in ncol(indata)){
if(is.numeric(indata[,i])){
indata[,i] <- round(indata[,i], digits = p)
}
}
}
outdata <- apply(mat, 2, roundFn, indata = mat, p = 3)但是,当我运行上面的代码时,我会收到一条错误消息,上面写着:
Error in FUN(newX[, i], ...) : unused argument (newX[, i])任何有关如何在此背景下正确使用应用功能的提示都将不胜感激。
发布于 2022-11-10 16:38:16
您的roundFn函数循环遍历indata的每一列,因此将其应用于每一列具有apply的列是多余的。您可以(1)直接将roundFn应用于mat,也可以(2)重新定义roundFn以对mat的列进行操作,然后将其应用于带有apply的每一列。
mat = replicate(3, runif(10)) #a smarter way to create a random matrix第一种方法:
roundFn <- function(indata, p){
for (i in 1:ncol(indata)){ #here you missed the "1:" before "ncol(indata)"
if(is.numeric(indata[,i])){
indata[,i] <- round(indata[,i], digits = p)
}
}
return(indata) #you forgot to say what your function should return
}
outdata <- roundFn(mat, 3)第二种方法:
roundFn <- function(indata.col, p){ #now, it receives a column
if(is.numeric(indata.col)){
return(round(indata.col, digits = p))
}
}
outdata <- apply(mat, 2, roundFn, p = 3)正如@Allan和@M-在注释中指出的那样,roundFn与round非常相似,唯一的区别是它只适用于数字列。因此,您可以从以下位置获得相同的输出:
使用R基:
apply(mat[,apply(mat, 2, is.numeric)], 2, round, digits = 3)使用dplyr/tidyverse:
library(tidyverse)
mutate(as_tibble(mat), across(where(is.numeric), round, digits = 3))https://stackoverflow.com/questions/74392326
复制相似问题