R-将字符串用作表达式

R-将字符串用作表达式,r,concatenation,R,Concatenation,在开始之前,我会说我知道这是一个有点奇怪的问题,但我不知道如何表达它 在特定的R脚本中,我有以下几行代码: hist(sce$total_counts/1e6, xlab="Library sizes (millions)", main="", breaks=20, col="grey80", ylab="Number of cells"); 对于此位: sce$total_counts/1e6 1e6部分应该是一个用户输入,我正在尝试设置它,以便第一部分和用户部分“连接”,然后进行计算

在开始之前,我会说我知道这是一个有点奇怪的问题,但我不知道如何表达它

在特定的R脚本中,我有以下几行代码:

hist(sce$total_counts/1e6, xlab="Library sizes (millions)", main="", 
 breaks=20, col="grey80", ylab="Number of cells");
对于此位:

sce$total_counts/1e6
1e6
部分应该是一个用户输入,我正在尝试设置它,以便第一部分和用户部分“连接”,然后进行计算。问题是使用粘贴和其他东西返回字符串,我不想要字符串。例如,我希望能够用“/1e3”替换“/1e6”部分,而不更改该行代码的任何其他内容,并且仍然可以工作。我试着做到以下几点:

object <- paste("sce$total_counts", args[1], sep="")
ob <- parse(text=object) # expression(sce$total_counts/1e6)
hist(ob, xlab="Library sizes (millions)", main="", 
 breaks=20, col="grey80", ylab="Number of cells");

除了说:如何将代码的一部分别名为其他内容?我希望用户输入为“/1e6”的
ob
sce$total_counts/1e6

的意思相同,如果您想在执行直方图之前对
hist
的第一个参数执行aribitrary变换,那么就传递一个进行变换的函数

myhist <- function(f, ...) {
  f <- match.fun(f)
  x <- 1:20
  hist(f(x, ...))
}

# test runs
myhist("/", 1e6)
myhist(function(x) x / 1e3)
f <- function(x) x / 100; myhist(f)
myhist(sqrt)

如果您想在执行直方图之前对
hist
的第一个参数执行aribitrary转换,那么请传递一个执行转换的函数

myhist <- function(f, ...) {
  f <- match.fun(f)
  x <- 1:20
  hist(f(x, ...))
}

# test runs
myhist("/", 1e6)
myhist(function(x) x / 1e3)
f <- function(x) x / 100; myhist(f)
myhist(sqrt)


不需要所有这些粘贴等。只要做
x尝试
eval(parse(text=object))
@DominicComtois-引用
fortunes::fortune(106)
“如果答案是parse(),你通常应该重新思考这个问题。”@thelatemail我知道。。。这是一个快速而肮脏的解决方案,但有时。。。无论如何也许我们需要更多地了解OP获取用户输入的方式。一个简单的
as.numeric(用户输入)
在某些情况下可以工作…@DominicComtois你是对的。最后,我把一切都修好了。我是在装傻。我看到了“e”并自动假设它是一个字符串而不是一个数字!!不需要所有这些粘贴等。只要做
x尝试
eval(parse(text=object))
@DominicComtois-引用
fortunes::fortune(106)
“如果答案是parse(),你通常应该重新思考这个问题。”@thelatemail我知道。。。这是一个快速而肮脏的解决方案,但有时。。。无论如何也许我们需要更多地了解OP获取用户输入的方式。一个简单的
as.numeric(用户输入)
在某些情况下可以工作…@DominicComtois你是对的。最后,我把一切都修好了。我是在装傻。我看到了“e”并自动假设它是一个字符串而不是一个数字!!这里可能有安全问题。如果用户传入了一些邪恶的函数呢?同意,如果用户是CLI上的程序员,那没关系,但如果用户是闪亮web应用程序的另一端,则可能不是。顺便提一下,缩短函数定义的另一种方法是使用
dplyr
/
magrittr
:例如,
myhist(.%>%{./3})
myhist(.%>%sqrt%%>%log)
。很抱歉,我认为用户界面的注释不相关。这是一个似乎要求有能力进行任意转换的问题,因此不是关于这个答案,而是关于任何答案。如果你真的坚持要提出这样的观点,最好把它们作为对问题的评论。magrittr的想法很有趣。请注意,magrittr函数定义要求使用点,但
fn$
允许任何变量名。我们在这里的示例中使用了
x
,但是可以使用任何名称。它扫描公式中的自由变量,并假定它们是按遇到的顺序排列的参数。或者,如果希望显式,可以将参数指定为公式左侧的和,因此
x~sqrt(x)
~sqrt(x)
相同。此处可能存在安全问题。如果用户传入了一些邪恶的函数呢?同意,如果用户是CLI上的程序员,那没关系,但如果用户是闪亮web应用程序的另一端,则可能不是。顺便提一下,缩短函数定义的另一种方法是使用
dplyr
/
magrittr
:例如,
myhist(.%>%{./3})
myhist(.%>%sqrt%%>%log)
。很抱歉,我认为用户界面的注释不相关。这是一个似乎要求有能力进行任意转换的问题,因此不是关于这个答案,而是关于任何答案。如果你真的坚持要提出这样的观点,最好把它们作为对问题的评论。magrittr的想法很有趣。请注意,magrittr函数定义要求使用点,但
fn$
允许任何变量名。我们在这里的示例中使用了
x
,但是可以使用任何名称。它扫描公式中的自由变量,并假定它们是按遇到的顺序排列的参数。或者,如果希望显式,可以将参数指定为公式LHS上的和,因此
x~sqrt(x)
~sqrt(x)
相同。
library(gsubfn)
fn$myhist(~ x / 1e6)
fn$myhist(~ sqrt(x))