如何将连接字符串传递给R中的函数

时间:2016-03-26 08:52:53

标签: r function character-encoding

我遇到了如何传递类似于我的全局数据中数据集名称的连接字符串的问题。 Name1到Name12是一个数据集

Name1 3obs of 2variables

Name2 4obs of 2variables

...

Name12 2obs of 2variables

我想简化我的代码,因为我做了一个for循环来打印每个数据集名称

for(j in 1:12){
name<-paste("Name",j,sep="")
print(name)
}

之后我尝试将其传递给函数

for(j in 1:12){
name<-paste("Name",j,sep="")
Greetings(name)
}

但我遇到了

Error in name$gender : $ operator is invalid for atomic vectors

Greetings <- function(name){
check<-name$gender
if(check==male) cat("Greetings","Mr",name$person)
else cat("Greetings","Ms",name$person)
}

2 个答案:

答案 0 :(得分:1)

你对String没有问题,它完全没问题。相反,您需要一个用于检查性别的数据库。你不能只在字符串上调用$gender,希望它会告诉你它是男性还是女性。您将需要一个data.frame或一个表格,您可以在其中查找名称是女性还是男性。

此外,name$person也不起作用,因为name只是一个字符串。不要混用字符串和data.frame / table。

如果您已经存放了存放性别的data.frame / table,则必须分别从dataFrame[name=name,]$gender dataFrame[name=name,]$person的data.frame / table中提取此值,其中第一个{{1}是你的变量的列标题和第二个name,包含你想要检查为String的名称。

编辑:如果name是包含变量名称的字符串,则需要使用eval(as.name(name))来引用变量。

答案 1 :(得分:1)

Greetings函数中,name是一个字符串,而不是data.frame。在问候语功能中添加print(name)即可查看。

Greetings <- function(name){
  print(name)
  # check<-name$gender
  # if(check==male) cat("Greetings","Mr",name$person)
  # else cat("Greetings","Ms",name$person)
}
Greetings(name)
# [1] "Name1"

看到这只是一个字符串,而不是你的data.frame

要使用字符串name来引用您的data.frame,您需要使用get()来引用您的R对象。

考虑这个示例数据:

Name1 <- data.frame(gender= c("male"),
                    person= c("a"), stringsAsFactors = FALSE)

## Create a string representing the data.frame as per your original code 
## (can be done in a loop)
name <- paste("Name", "1", sep="")

Greetings函数中,您可以使用get(name)引用data.frame。 (你还需要male左右的引号),比如

Greetings <- function(name){
  check <- get(name)

  ## note this will only work as expected with a data.frame 
  ## with one row.
  if(check$gender=="male") cat("Greetings","Mr", check$person)
  else cat("Greetings","Ms",check$person)
}

Greetings(name)
# Greetings Mr a