【问题标题】:Passing argument to factor() in R将参数传递给 R 中的 factor()
【发布时间】:2015-02-03 16:50:24
【问题描述】:

我有一个看起来像这样的 R 代码:

StatFunction <- function(CSVImport, AnimalID_i,Treatment_i){

  #Data Input from a CSV file (example below)
  Data <- read.csv(CSVImport)

到目前为止一切顺利,因为数据是从 csv 文件中读取的。我这样调用函数

StatFunction (path/to/file/, "Animal", "Treatment")

请注意,输入参数是表示 CSV 列名的字符串。现在,我尝试这样整理数据框:

  #Trying to sort out the input
  Data <- within(Data, {

    FinalID <-  (factor(as.character(FinalID_i))) 
    AnimalID <- (factor(as.character(AnimalID_i))) 

这不适用于 StatFunction 的参数。它给了我这个

[1] "---Final ID---"
[1] Treatment
Levels: Treatment
[1] "---Animal ID---"
[1] Animal
Levels: Animal

什么时候,直接把参数代入代码中,像这样

    FinalID <-  (factor(Treatment))                
    AnimalID <- (factor(Animal))                   

它给了我预期的结果。

    [1] "---Final ID---"
    [1] 0 0 1 1 1
    Levels: 0 1
    [1] "---Animal ID---"
    [1] 722 723 724 727 728
    Levels: 722 723 724 727 728

所以我的问题是如何在传递参数而不是在代码中烧掉名称时使其工作?

【问题讨论】:

  • withwithin 用于交互使用,而不是编程内部函数。
  • 另外,把它分解成一个最小的例子。您的输入参数是否来自 Shiny 应用程序并不重要,让函数与 StatFunction("filename", "appropiate_animal_id", "some_final_id") 一起工作,并给我们一个示例来说明这些参数实际上可能是什么。
  • 谢谢。简化了帖子。现在更有意义了吗?
  • @Gregor,您能否指出我的参考资料或说明为什么 withwithin 用于交互使用而不是编程?没有类似于?subset 中的警告或帮助文件中的其他指示,所以我认为不会有问题。
  • @docendodiscimus 我可能在上面夸大了它,但我认为公平地说,在程序设置中应谨慎使用非标准评估的任何内容。 With/within 确实出现in this answer。使用with 的函数在大多数情况下可能会很好,但是内部使用with 的函数的包不会通过R CMD CHECK——它至少会警告“全局变量没有可视绑定”。

标签: r


【解决方案1】:

您不能只交换字符和符号值。如果要提取具有字符值的数据,请使用

Data$FinalID <- factor(as.character(Data[[FinalID_i]]))
Data$AnimalID  <- factor(as.character(Data[[AnimalID_i]]))

【讨论】:

    【解决方案2】:

    为什么不退一步,通过添加传递给read.csv()colClasses 参数来添加您想要通过名称分解列的事实。或者你可以添加, ...) 并做同样的事情。 ... 可以发送到read.csv() 参数列表。

    statFunction <- function(file, colClasses = character(), ...) {
        read.csv(file, colClasses = colClasses, ...)
    }
    

    然后像这样打电话给statFunction()

    statFunction(
        file, 
        colClasses = c(Animal = "factor", Treatment = "factor")
    )
    

    【讨论】:

      猜你喜欢
      • 2015-12-05
      • 2012-06-07
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 2019-03-18
      相关资源
      最近更新 更多