2017-06-27 42 views
0

我有一个R函数,它可以根据原始数据生成并返回列表(a)列表和(b)测试数据分区。R功能 - 从多个值列表中访问单个返回值

我已将此功能应用于Riris数据集。然后我将列车数据分区送入lda model。截断的输出和错误消息(来自lda部分)如下所示。

下面的代码片段:

myfunc <- function(rawdata,) { 
    .... 
    return(list(train,test))} 

dfs = create_data_partition(mydf) 
dfs[1] 
dfs[2] 

control <- trainControl(method="cv", number=10) 
metric <- "Accuracy" 

set.seed(7) 
fit_lda <- train(Species~., data=dfs[1], method="lda", metric=metric, trControl=control) 

这里是输出:

[[1]] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   5.1   3.5   1.4   0.2  setosa 
2   4.9   3.0   1.4   0.2  setosa 
. 
. 
150   5.9   3.0   5.1   1.8 virginica 

[[1]] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
18   5.1   3.5   1.4   0.3  setosa 
19   5.7   3.8   1.7   0.3  setosa 
. 
. 
125   6.7   3.3   5.7   2.1 virginica 
134   6.3   2.8   5.1   1.5 virginica 
138   6.4   3.1   5.5   1.8 virginica 

Error in eval(expr, envir, enclos) : object 'Species' not found 
Calls: train ... eval -> <Anonymous> -> model.frame.default -> eval -> eval 
Execution halted 

我认为这个问题是dfs[1]不是dataframe - 而不是它有[[1]]在它的前面。这是如何在功能myfuncreturned multiple values - 我认为这return(list(train,test))格式不正确,但我不知道这是为什么发生的原因。

问题 调用一个函数R返回多个值(列表),是否有单独访问返回值的方法后?

+1

请参阅:https://stackoverflow.com/questions/1169456/the-difference-between-and-notations-for-accessing-the-elements-of-a-lis –

+0

谢谢。很简单。答:我需要使用'data = dfs [[1]]'而不是'data = dfs [1]'。再次感谢! –

+0

正确,但了解差异可能非常重要,所以请花时间在头脑中清楚说明。 –

回答

1

使用双方括号表示法提取单列表元素:[[。如果要提取的第一个列表元素,而不是产生一个新的列表,你需要

dfs[[1]] 

这在Language Definition多一点明确的阐述。

+0

我*想*我也在考虑这些方面。但是,我错误地尝试了:'dfs [1] [1]'。我认为第二个'[1]'可以避免创建一个新列表。 –