1

我有一个我想在 R 中创建的函数,如下所示:

diff_abund <- function(Data, Rank, Taxa) {
subset_taxa(Data, Rank == Taxa)
}

da= diff_abund(frbc1_02, Phylum, "Acidobacteria") 

我得到了错误:

Error in eval(e, x, parent.frame()) : object 'Rank' not found 

问题似乎与 Rank == Taxa 部分有关。如果我像这样从函数中删除它:

diff_abund <- function(Data) {

subset_taxa(Data, Phylum == "Acidobacteria")

}
da= diff_abund(frbc1_02) 

该功能正常工作。数据集是一个 S4 对象,仅适用于 phyloseq 包。“等级”基本上是一组从王国到物种的向量。不知道你会怎么称呼它。这可能发生的任何原因?谢谢你,山姆

4

2 回答 2

0

你需要适应substitute你的情况并eval评估它Data。我不知道subset_taxa,但这应该与substitute. 在下文mtcars中,我使用 R 附带的示例数据。

diff_abund <- function(Data, Rank, Taxa) {
  cond <- substitute(Rank == Taxa)
  e <- eval(cond, Data)
  subset(Data, e)
}
diff_abund(mtcars, cyl, "6") 
#                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
# Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
# Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

在您的子问题中,您可能希望参数是固定的,并且只是Taxa在函数调用中动态定义。您可以更改参数的顺序,并使用=.

FX <- function(Taxa, Data=mtcars, Rank=mtcars$cyl) {
  subset(Data, eval(substitute(Rank == Taxa), Data))
}
FX("6") 
#                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
# Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
# Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

注意:最好不要F用作函数名,因为它是FALSE. 您可以检查名称是否已在使用中?,例如?F

于 2020-05-31T05:46:03.293 回答
-1

第一件事:无论何时发布,提供一个可重复的示例:或者使用您创建的示例数据;或使用您自己的一小部分数据(使用 dput())。否则,我们提供帮助的方式将受到限制。

一般来说,引号会超出函数的范围。如果年份应该是字符,并且我有一些功能,我想将年份添加到我要编写的数据集中


    random.fun <- function(dat, yr){
    dat%>%
    mutate(yr = year)
    }

然后我会创建一个变量并调用该函数,将其分配给变量。


    df <- random.fun(dataset, "2007")

您的代码还有其他问题,而且,如果不知道您真正想要做什么,就很难提供帮助。但在下面,subset_taxa 看起来并不是一个有意义的函数。


    diff_abund <- function(Data,Rank,Taxa) {

    FTaxa=subset_taxa(Data, Rank == "Taxa")

    }
    diff_abund(frbc1_02, Phylum, "Acidobacteria")

一般来说,我更喜欢用 dplyr 写作

    library(tidyverse)

    diff_abund <- function(data, rank, taxa){
    data%>%
    filter(rank==taxa)
    }

    newdf <- diff_abund(df, phylum, "taxa")

于 2020-05-31T05:54:26.800 回答