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