我有一个功能来做一个PCA图,如下所示。我想传递主要组件的名称(变量a和b),但还没有找到一种方法来做到这一点。我尝试过使用aes_string。收到的错误是eval中的错误(expr,envir,enclos):object' .names'找不到
根据以下建议,我举了一个具体的例子。一个功能可以工作,另一个功能不工作。目标是将变量传递给此函数。
#data
d = iris[1:4]
#########################################################################
# PCA_Plot functions
#########################################################################
PCA_Plot = function(pcaData)
{
library(ggplot2)
theta = seq(0,2*pi,length.out = 100)
circle = data.frame(x = cos(theta), y = sin(theta))
p = ggplot(circle,aes(x,y)) + geom_path()
loadings = data.frame(pcaData$rotation, .names = row.names(pcaData$rotation))
p + geom_text(data=loadings, mapping=aes(x = PC1, y = PC2, label = .names, colour = .names, fontface="bold")) +
coord_fixed(ratio=1) + labs(x = "PC1", y = "PC2")
}
# non-working function with two extra variables
PCA_Plot2 = function(pcaData, var1, var2)
{
library(ggplot2)
theta = seq(0,2*pi,length.out = 100)
circle = data.frame(x = cos(theta), y = sin(theta))
p = ggplot(circle,aes(x,y)) + geom_path()
loadings = data.frame(pcaData$rotation, .names = row.names(pcaData$rotation))
p + geom_text(data=loadings, mapping=aes(x = var1, y = var2, label = .names, colour = .names, fontface="bold")) +
coord_fixed(ratio=1) + labs(x = var1, y = var2)
}
#pca
library(stats)
p = prcomp(d)
PCA_Plot(p) #works
PCA_Plot2(p, "PC1", "PC2") # ERROR Error: Discrete value supplied to
continuous scale
答案 0 :(得分:1)
没有您的数据,这里是使用一些基本R数据集的函数的简化示例。我认为你有一个问题:你只能通过使用与列名对应的字符串来直接访问列。相反,您希望使用q_var <- quo(var)
之类的内容,然后!!q_var
使用其名称引用该列。编写这样的函数我遇到了相当多的麻烦,但请参阅&#34;使用dplyr编程&#34;小插图有更多解释。
library(tidyverse)
make_plot <- function(full_df, var1, var2) {
# use quo to access the values in the strings var1, var2
quo_var1 <- quo(var1)
quo_var2 <- quo(var2)
df <- full_df %>% rownames_to_column("name") %>% select(name, x = !!quo_var1, y = !!quo_var2)
ggplot(df, aes(x = x, y = y)) +
geom_text(aes(label = name), size = 2.5) +
# still have var1, var2 strings--can use as labels
labs(x = var1, y = var2)
}
make_plot(mtcars, "mpg", "disp")
make_plot(mtcars, "hp", "qsec")
make_plot(as.data.frame(state.x77), "Income", "Life Exp")
由reprex package(v0.2.0)创建于2018-04-20。
答案 1 :(得分:1)
你几乎和aes_string
在一起!您提供的是var1
和var2
字符串,而不是label
审美.names
。如果将其更改为".names"
,则您的功能将起作用。
我改变了你的功能:
将库调用移到函数外部(每次调用函数时都不需要加载库)。
library(stats)
library(ggplot2)
PCA_Plot2 = function(pcaData, var1, var2)
{
theta = seq(0,2*pi,length.out = 100)
circle = data.frame(x = cos(theta), y = sin(theta))
loadings = data.frame(pcaData$rotation, .names = row.names(pcaData$rotation))
ggplot(circle, aes(x,y)) +
geom_path() +
geom_text(aes_string(x = var1, y = var2, label = ".names"), inherit.aes = FALSE, data = loadings) +
coord_fixed(ratio=1) +
labs(x = var1, y = var2)
}
PCA_Plot2(p, "PC1", "PC2")