假设我有以下函数接受参数<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="container chat-signin">
<form class="form-signin">
<h2>Chat Login</h2>
<label for="nickname">Nickname</label>
<input type="text" placeholder="Nickname" id="nickname">
<div>
<label for="chatroom">Chatroom</label>
<select size="1" id="chatroom">
<option>Gaming Soc</option>
<option>Pokemon Soc</option>
</select>
</div>
<button type="submit" id="enterRoom">Sign in</button>
</form>
</div>
。 var_name
是指数据框中变量的名称。现在考虑以下功能:
var_name
但是,我收到错误:
library(dplyr)
calculate_mean <- function(data, var_name) {
lapply(select(data, var_name), mean, na.rm=TRUE)
}
答案 0 :(得分:2)
df <- head(iris)
f <- function(data, var_name) {
select(data, var_name)
}
f(df, "Petal.Width")
#Error: All select() inputs must resolve to integer column positions.
#The following do not:
#* var_name
该软件包的作者倾向于编写可接受字符串作为参数的函数的可选版本。尝试在函数中添加下划线:
f2 <- function(data, var_name) {
select_(data, var_name)
}
f2(df, "Petal.Width")
# Petal.Width
#1 0.2
#2 0.2
#3 0.2
#4 0.2
#5 0.2
#6 0.4
进一步说明通常,未加引号的字符串被视为变量。如果我们在控制台中尝试x
,评估者将在环境中搜索具有该名称的变量。与函数一起使用时,将进行相同的搜索。使用mean(x)
必须定义变量x
。
当函数写入不搜索变量时,此行为可能会变得混乱。它被称为非标准评估,NSE。有base R
函数使用NSE。 subset(df, select= -Petal.Width)
返回没有Petal.Width
的数据框。这种便利性使编程更容易。 select
的设计方式与此类似。
创建函数时,它以标准方式进行评估;不带引号的参数被认为是变量。但是您正在将它用于NSE函数select
。该函数将查找var_name
,即使您希望它被用户的输入替换。让我们通过创建文字var_name
列来证明行为:
df$var_name <- 1
f(df, "Petal.Width")
var_name
1 1
2 1
3 1
4 1
5 1
6 1
select
的原始函数返回了列var_name
,而不是我们希望的列。 Hadley Wickham创造了select_
部分,以预测这种差异。