将data.frame作为参数传递给函数

Rob*_*Tan 2 r function

语境

作为R的后续版本:通过引用函数以及如何在函数内的数据框中添加列来传递data.frame

我正在尝试以下看似简单的功能:

naToZero <- function(df) { df$Vol[is.na(df$Vol)] <- 0 }

数据框

> str(WFM)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   990571 obs. of  14 variables:
 $ Date      : chr  "04/12/2017" "04/12/2017" "04/12/2017" "04/12/2017" ...
 $ Time      :Classes 'hms', 'difftime'  atomic [1:990571] 41970 41969 41968 41967 41966 ...
  .. ..- attr(*, "units")= chr "secs"
 $ Bar#      : chr  "197953/197953" NA "197952/197953" NA ...
 $ Bar Index : int  0 NA -1 NA NA -2 NA NA -3 NA ...
 $ Tick Range: int  0 NA 0 NA NA 0 NA NA 0 NA ...
 $ Open      : num  33.9 NA 33.9 NA NA ...
 $ High      : num  33.9 NA 33.9 NA NA ...
 $ Low       : num  33.9 NA 33.9 NA NA ...
 $ Close     : num  33.9 NA 33.9 NA NA ...
 $ Vol       : int  100 NA 200 NA NA 100 NA NA 400 NA ...
 $ MACDHist  : num  -59 NA -87 NA NA ...
 $ MACD      : num  -450 NA -445 NA NA ...
 $ MACDSig   : num  -391 NA -358 NA NA ...
 $ ZScore1   : num  NA NA NA NA NA NA NA NA NA NA ...
Run Code Online (Sandbox Code Playgroud)

希望使用此功能来加快数据清理速度。

问题

在脚本编辑器中运行该函数之后,然后传递一个data.frame来运行它。但是该功能没有任何作用,当我查看(WFM)时,它仍然是旧数据。但是,当我手动运行命令时:

WFM$Vol[is.na(WFM$Vol)] <- 0

然后就可以了。

我尝试过的事情

我尝试根据看似相关的两个链接进行实验:

使用WFM <- naToZero(WFM)会产生一个具有单个值0的向量。

尝试使用WFM <- data.table(WFM)和运行该功能...是同一回事。

我一定缺少基本的东西。

Kon*_*lph 6

实际上,R中的所有对象都是不可变的:操作不会修改原始对象,它们会创建一个副本。因此,您需要将该副本分配回原始副本。

<-这样做,但是它分配给df 函数内部,它是传递给函数的参数(= )的副本WFM

因此,您需要修改功能:

naToZero <- function(df) {
    df$Vol[is.na(df$Vol)] <- 0
    df
}
Run Code Online (Sandbox Code Playgroud)

…以及您如何称呼它:

WFM = naToZero(WFM)
Run Code Online (Sandbox Code Playgroud)