首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在应用函数中传递多个参数

在应用函数中传递多个参数
EN

Stack Overflow用户
提问于 2022-11-10 16:31:28
回答 1查看 26关注 0票数 0

我试图在应用函数的有趣参数中传递用户定义函数的2个参数,如下例所示:

代码语言:javascript
复制
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)

但是,当我运行上面的代码时,我会收到一条错误消息,上面写着:

代码语言:javascript
复制
Error in FUN(newX[, i], ...) : unused argument (newX[, i])

任何有关如何在此背景下正确使用应用功能的提示都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2022-11-10 16:38:16

您的roundFn函数循环遍历indata的每一列,因此将其应用于每一列具有apply的列是多余的。您可以(1)直接将roundFn应用于mat,也可以(2)重新定义roundFn以对mat的列进行操作,然后将其应用于带有apply的每一列。

代码语言:javascript
复制
mat = replicate(3, runif(10)) #a smarter way to create a random matrix

第一种方法:

代码语言:javascript
复制
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)

第二种方法:

代码语言:javascript
复制
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-在注释中指出的那样,roundFnround非常相似,唯一的区别是它只适用于数字列。因此,您可以从以下位置获得相同的输出:

使用R基:

代码语言:javascript
复制
apply(mat[,apply(mat, 2, is.numeric)], 2, round, digits = 3)

使用dplyr/tidyverse:

代码语言:javascript
复制
library(tidyverse)
mutate(as_tibble(mat), across(where(is.numeric), round, digits = 3))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74392326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档