Ошибка в коде R при вызове в функции (множественные, strsplit: не символьный аргумент) - PullRequest
1 голос
/ 30 октября 2019

Я хотел бы создать ярлыки из теста Тьюки внутри функции. Там он выдает ошибку, тогда как, если я вызываю код не внутри функции, он работает абсолютно нормально.

Другие потоки говорят, что решение состоит в том, чтобы преобразовать переменную с помощью "as.character", но когда я попробовал это, он сделалне работает.

К сожалению, я не смог понять ошибку, и было бы здорово, если бы вы могли мне помочь. Ошибка и трассировка находятся в последних строках.

Минимальный рабочий пример:

require(plyr)
require(multcomp)
require(multcompView) 
require(datasets)
data(iris)

iris
Dataset <- iris

####################################################################
#Works:
a=aov(Dataset$Sepal.Length ~ Dataset$Species)
tHSD <- TukeyHSD(a, ordered = FALSE, conf.level = 0.95)
generate_label_df <- function(HSD, flev){
  Tukey.levels <- HSD[[flev]][,4]
  Tukey.labels <- multcompLetters(Tukey.levels)['Letters']
  plot.labels <- names(Tukey.labels[['Letters']])
  boxplot.df <- ddply(Dataset, flev, function (x) max(fivenum(x$y)) + 0.2)
  plot.levels <- data.frame(plot.labels, labels = Tukey.labels[['Letters']],stringsAsFactors = FALSE)
  labels.df <- merge(plot.levels, boxplot.df, by.x = 'plot.labels', by.y = flev, sort = FALSE)
  return(labels.df)
}
LABELS <- generate_label_df(tHSD, 'Dataset$Species')


####################################################################
#Throws error:
doTukey <- function(y_var, x_var, ret=FALSE) {
  require(ggplot2)
  require(plyr)
  require(multcomp)

  a=aov(y_var ~ x_var)
  tHSD <- TukeyHSD(a, ordered = FALSE, conf.level = 0.95)
  generate_label_df <- function(HSD, flev){
    Tukey.levels <- HSD[[flev]][,4]
    Tukey.labels <- multcompLetters(Tukey.levels)['Letters']
    plot.labels <- names(Tukey.labels[['Letters']])
    boxplot.df <- ddply(Dataset, flev, function (x) max(fivenum(x$y)) + 0.2)
    plot.levels <- data.frame(plot.labels, labels = Tukey.labels[['Letters']],stringsAsFactors = FALSE)
    labels.df <- merge(plot.levels, boxplot.df, by.x = 'plot.labels', by.y = flev, sort = FALSE)
    return(labels.df)
  }

  LABELS <- generate_label_df(tHSD, 'Dataset$Species')
}

doTukey(Dataset$Sepal.Length, Dataset$Species) # Error:  Error in strsplit(x, sep) : non-character argument, 
#Trace:
#5.strsplit(x, sep) 
#4.vec2mat2(namx) 
#3.multcompLetters(Tukey.levels) 
#2.generate_label_df(tHSD, "Dataset$Species") 
#1.doTukey(Dataset$Sepal.Length, Dataset$Species) 

Спасибо

1 Ответ

1 голос
/ 30 октября 2019

Вы правы, проблема возникает с этим

multcompLetters(Tukey.levels)

Когда ваш aov является функцией, имена берутся из переменной формулы, вы можете увидеть в моем примере ниже:

Dataset = iris
Tukeyobj <- function(y_var, x_var, ret=FALSE) {

  a=aov(y_var ~ x_var)
  tHSD <- TukeyHSD(a, ordered = FALSE, conf.level = 0.95)
  return(tHSD)
}
names(Tukeyobj(Dataset$Sepal.Length, Dataset$Species))
#returns "x_var"

Итак, в вашей функции HSD [[flev]] возвращает NULL и strsplit для NULL, что на удивление выдает эту ошибку. Всегда проверяйте, что вы вызываете в функции, старайтесь сделать ее самодостаточной. Я внес небольшие исправления в то, что он имеет, он должен работать:

require(plyr)
require(multcomp)
require(multcompView) 
require(datasets)
data(iris)

 generate_label_df <- function(HSD, flev,DATA){
    Tukey.levels <- HSD[[flev]][,4]
    Tukey.labels <- multcompLetters(Tukey.levels)['Letters']
    plot.labels <- names(Tukey.labels[['Letters']])
    boxplot.df <- ddply(DATA, flev, function (x) max(fivenum(x$y)) + 0.2)
    plot.levels <- data.frame(plot.labels, labels = Tukey.labels[['Letters']],stringsAsFactors = FALSE)
    # note this part doesn't work
    # last column is all NAs
    labels.df <- merge(plot.levels, boxplot.df, by.x = 'plot.labels', by.y = flev, sort = FALSE)
    return(labels.df)
  }

doTukey <- function(y_var, x_var,DATA,ret=FALSE) {
  FORMULA = as.formula(paste(y_var,"~",x_var))
  a=aov(FORMULA,data=DATA)
  HSD <- TukeyHSD(a, ordered = FALSE, conf.level = 0.95)
  return(generate_label_df(HSD,x_var,DATA))
}

doTukey("Sepal.Length","Species",iris) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...