【问题标题】:scale can't recognize parameter in function with R规模无法识别函数中的参数与R
【发布时间】:2019-12-14 12:27:36
【问题描述】:

我真的在这个社区得到了很多帮助。非常感谢您的帮助。

我正在制作function。在function 参数中,有scale,它将值标准化。

但是,当参数进入scale 时,function 无法识别该参数。

set.seed(1000)
a<-rnorm(10)
b<-rnorm(10)
test<-as.data.frame(cbind(a,b))

fun<-function(i,j,k){
  x<-
    test%>%dplyr::select(i,j)%>%
    dplyr::mutate(i=scale(i),
                  j=scale(j))
  return(x)
}
fun(i="a",j="b")

 Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric 

我尝试了几种方法,但都失败了。

  1. 一开始,我是用dplyr 做的。出现错误后,我将其更改为基本功能。失败了。

  2. 我将双括号 {{}} 放在对象周围。失败了。

  3. 我输入了as.formula。它识别参数,但它识别为独立对象,而不是在原始数据帧中。

    eval(parse(text = x, keep.source = FALSE)[[1L]]) 中的错误: 找不到对象“a”

【问题讨论】:

    标签: r function


    【解决方案1】:

    要传递带引号的列,我们可以在函数中使用mutate_at

    library(dplyr)
    
    fun <- function(test, i, j) {
       test %>% mutate_at(vars(i, j), scale)
    }
    fun(test, "a", "b")
    
    #         a      b
    #1  -0.1673 -0.701
    #2  -1.2571 -0.152
    #3   0.5308  0.714
    #4   1.3886  0.403
    #5  -0.6559 -1.154
    #6  -0.0809  0.776
    #7  -0.2105  0.757
    #8   1.5038  0.590
    #9   0.4453 -2.065
    #10 -1.4969  0.832
    

    【讨论】:

    • 非常感谢!我可以再问你一个问题吗?我在“安排”功能中遇到了同样的问题。它无法识别其中的参数。出现“错误:位置 1 的尺寸 (1) 不正确,应为:5”。有解决办法吗?
    • @ESKim 是的,如果您有列的字符串名称,那么dplyr 的所有_at 变体都会有帮助。
    • 嗯...但是,使用 'mutate_at',我无法创建新变量,例如 mutate(new_variable=~)。有没有办法创建新变量?
    • @ESKim 是的,把这个放到函数test %&gt;% mutate_at(vars(i, j), list(new = ~scale(.)))
    【解决方案2】:

    如果我们以不带引号的形式传递,那么一个选项是

    fun <- function(test, i, j) {
       i1 <- rlang::quo_name(enquo(i))
       j1 <- rlang::quo_name(enquo(j))
       test %>% 
           mutate(!! i1:= scale({{i}}),
                       !! j1 := scale({{j}}))
    }
    fun(test, a, b)
    #           a          b
    #1  -0.16730753 -0.7009831
    #2  -1.25711119 -0.1524233
    #3   0.53081842  0.7139501
    #4   1.38860927  0.4034140
    #5  -0.65591381 -1.1542672
    #6  -0.08086494  0.7763465
    #7  -0.21045016  0.7571458
    #8   1.50383307  0.5903152
    #9   0.44531788 -2.0650886
    #10 -1.49693102  0.8315905
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2022-01-04
      • 2020-02-13
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多