Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的不同表达方式中的一种方式”;子集();函数在R中失败_R - Fatal编程技术网

“的不同表达方式中的一种方式”;子集();函数在R中失败

“的不同表达方式中的一种方式”;子集();函数在R中失败,r,R,我在subset()的帮助文件中发现,“选择”或“反向选择”的语法不同。具体来说,在“选择”示例中,列的名称由c()包围,但在“反向选择”中,没有c()。此外,它们都没有定量标记。所以我尝试了一些不同的语法: ## For `selection` # standard usage in Help subset(airquality, select = c(Temp)) # some different syntax # (1a) add quotation mark: worked subs

我在
subset()
的帮助文件中发现,“选择”或“反向选择”的语法不同。具体来说,在“选择”示例中,列的名称由
c()
包围,但在“反向选择”中,没有
c()
。此外,它们都没有定量标记。所以我尝试了一些不同的语法:

## For `selection` 
# standard usage in Help
subset(airquality, select = c(Temp))

# some different syntax
# (1a) add quotation mark: worked
subset(airquality, select = c("Temp"))
# (2a) remove "c()": worked
subset(airquality, select = Temp)

## For `inverse selection` 
# standard usage in Help
subset(airquality, select = -Temp)

# some different syntax
# (1b) add "c()": worked
subset(airquality, select = -c(Temp))
# (2b) add quotation mark: failed
#     Error in -c("Temp") : invalid argument to unary operator
subset(airquality, select = -c("Temp"))
除了最后一个例子,这些非标准用法都有效。最后一个示例生成了一个错误:
error in-c(“Temp”):一元运算符的参数无效

我有两个问题:

(1) 为什么会发生这种错误?因为在
(1a)
(2b)
中,这两种非标准用法似乎相同,但
(1a)
成功,而
(2b)
失败


(2) 有人能告诉我什么时候应该在
c()
中使用
c()
,或者

所以我深入研究了
子集的源函数:

subset <- function(df, vars) {
  vars <- substitute(vars)
  var_pos <- setNames(as.list(seq_along(df)), names(df))
  pos <- eval(vars, var_pos)
  df[, pos, drop = FALSE]
}
由于没有在
的“Temp”
上应用任何操作,因此该操作的评估结果很好。但是,如果我们尝试输入
-“Temp”
,我们会得到以下结果:

vars <- substitute(-"Temp")
> vars
-"Temp"
var_pos <- setNames(as.list(seq_along(airquality)), names(airquality))
> var_pos
$Ozone
[1] 1

$Solar.R
[1] 2

$Wind
[1] 3

$Temp
[1] 4

$Month
[1] 5

$Day
[1] 6
pos <- eval(vars, var_pos)
这里我们有
pos
,它是
-4
,所以我们可以从数据框中删除第四列

df <- airquality[, pos, drop = FALSE]
> head(df)
  Ozone Solar.R Wind Month Day
1    41     190  7.4     5   1
2    36     118  8.0     5   2
3    12     149 12.6     5   3
4    18     313 11.5     5   4
5    NA      NA 14.3     5   5
6    28      NA 14.9     5   6
df头(df)
臭氧太阳.R风月日
1    41     190  7.4     5   1
2    36     118  8.0     5   2
3    12     149 12.6     5   3
4    18     313 11.5     5   4
5 NA NA 14.3 5 5
628NA 14.956
 vars <- substitute(-Temp)
> vars
-Temp
var_pos <- setNames(as.list(seq_along(airquality)), names(airquality))
pos <- eval(vars, var_pos)
> pos
[1] -4
df <- airquality[, pos, drop = FALSE]
> head(df)
  Ozone Solar.R Wind Month Day
1    41     190  7.4     5   1
2    36     118  8.0     5   2
3    12     149 12.6     5   3
4    18     313 11.5     5   4
5    NA      NA 14.3     5   5
6    28      NA 14.9     5   6