在R函数中计算参数中的feed

时间:2014-12-19 15:19:46

标签: r

我正在尝试创建一个简单的函数,代码如下。但是,它无法返回正确的结果。在我输入的数据集中计算参数时看起来有些问题。请注意两个数据集名称的差异 。感谢。

# rm(list=ls())

 test <- function(x,data)
 {
  print(data)
  print(data$x)
  xx <- length(data$x)
  print(xx)
 }

d1 <- data.frame(xxx1 = rnorm(10),y = rnorm(10))
d2 <- data.frame(x1 = rnorm(10),x2 = rnorm(10))

 test(x=xxx1,data=d1)
 test(x=x1,data=d2)

The results are as following:
>  test(x=x1,data=d1)
         xxx1          y
1   1.1976719  0.3422267
2   0.1863663 -1.5267006
3   1.2044051 -0.2211713
4  -1.0827978  0.6388845
5  -1.6314412  0.6309162
6  -0.6264726  0.7855017
7   0.9912183  1.1109213
8   1.1658551 -0.8563175
9  -0.8778005 -1.9348057
10 -1.4465090  0.8464065
 [1]  1.1976719  0.1863663  1.2044051 -1.0827978 -1.6314412 -0.6264726  0.9912183  1.1658551 -0.8778005
[10] -1.4465090
[1] 10
>  test(x=x1,data=d2)
            x1          x2
1  -0.93388020  0.03993569
2  -1.73095495 -0.75134538
3   0.47888712  0.63941807
4  -0.80939001 -0.58040926
5   0.04684764  0.33309722
6  -1.17750788 -0.51169065
7  -0.05831090 -0.14130119
8   0.30952007  0.94296496
9  -1.18719053 -0.26489856
10 -1.59910816  2.40018124
NULL
[1] 0

1 个答案:

答案 0 :(得分:3)

一个问题是,您使用$符号表示字符串中的变量,这些符号在R中不起作用。您必须使用[来进行子集化。这是一个例子:

var <- "xxx1"
d1$var
NULL

d1[[var]]
#[1]  1.626529985 -1.632039310 -0.476739801  0.114311268  2.031158631  0.128500178
#[7] -0.350156247  0.725457870  0.088846946 -0.004896103

输入help("[")以获取更多相关信息。

这是您的功能的修改版本:

test2 <- function(x, data) {
  list("the_data" = data, 
       "the_column" = data[[x]], 
       "column_length" = length(data[[x]]))
}

> test2("xxx1", d1)
$the_data
           xxx1          y
1   1.626529985  1.2345354
2  -1.632039310 -0.8485866
3  -0.476739801  2.6139171
4   0.114311268  1.1182175
5   2.031158631 -0.3763318
6   0.128500178 -2.1893439
7  -0.350156247 -1.9657310
8   0.725457870  0.3362859
9   0.088846946  0.3781846
10 -0.004896103  1.5766200

$the_column
 [1]  1.626529985 -1.632039310 -0.476739801  0.114311268  2.031158631  0.128500178
 [7] -0.350156247  0.725457870  0.088846946 -0.004896103

$column_length
[1] 10

提示:$使用部分匹配,而[不使用(默认情况下)。这可以通过以下mtcars数据集来证明:

colnames(mtcars)
#[1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

mtcars$cy    # incomplete colname but it returns the cyl column:
#[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4

mtcars[[cy]]
#Error in (function(x, i, exact) if (is.matrix(i)) as.matrix(x)[[i]] else .subset2(x,  : 
#  object 'cy' not found

mtcars[["cy"]]
# NULL

> mtcars[["cyl"]]
# [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4